Tôi có cái này:
$itemCode = $area->pickSpecificItemByType[$type]->getItemCode[];
Có thể là
$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
9 có thể trả lại null. Do đó, gọi $item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
0 sẽ là không thể.Cách sạch nhất và/hoặc hiệu quả nhất để làm điều này là gì?
Có lựa chọn nào tốt hơn thế này không?
$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
Đã hỏi ngày 18 tháng 5 năm 2015 lúc 3:19May 18, 2015 at 3:19
2
Thay vì gọi pickspecitemByType [] hai lần, bạn có thể làm:
$item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
Mặc dù một biến khác được giới thiệu [$ item], bạn đạt được về khả năng đọc.
Đã trả lời ngày 18 tháng 5 năm 2015 lúc 3:27May 18, 2015 at 3:27
1
--- [ chỉnh sửa ] ---
Câu trả lời ban đầu dưới đây được viết cho PHP 5.*.
Đối với PHP hiện đại [7, 8], xin vui lòng xem toán tử khống không ?? và [trong php8] null-safe?-> toán tử
//stackoverflow.com/a/63222028/773522
---[ nguyên bản ]---
$itemCode = @$area->pickSpecificItemByType[$type]->getItemCode[];
Gọi getItemCode [] sẽ không thể là không thể, nó sẽ chỉ đưa ra một lỗi.
Nhân vật điều khiển '@' bảo PHP bỏ qua cảnh báo. Nếu bạn đi vào trạng thái cảnh báo này, bạn sẽ nhận được một chuỗi trống [đó là những gì mã ternary của bạn đã sử dụng], vì vậy đó là một sự thay thế khá.
//php.net/manual/en/language.operators.errorcontrol.php
Đã trả lời ngày 18 tháng 5 năm 2015 lúc 3:24May 18, 2015 at 3:24
fbasfbasfbas
1.6463 huy hiệu vàng16 Huy hiệu bạc26 Huy hiệu đồng3 gold badges16 silver badges26 bronze badges
5
Một cái gì đó sẽ như thế này tốt hơn?
if[ empty[ $itemCode ] ]
{
// $itemCode is empty.
}else{
// Do Something
}
Đã trả lời ngày 18 tháng 5 năm 2015 lúc 3:24May 18, 2015 at 3:24
fbasfbas
$item = pickSpecificItemByType[$type];
if[ $item == '' ]
{
// if $itemCode is empty.
}else{
// Do the stuff that you wanted to do if $item is not null
$area->$item->getItemCode[];
}
1.6463 huy hiệu vàng16 Huy hiệu bạc26 Huy hiệu đồng
Một cái gì đó sẽ như thế này tốt hơn?May 18, 2015 at 3:28
Dễ dàng tối ưu hóa hiệu suất mã PHP trong sản xuất với Datadog APM. Cho phép các vấn đề về khả năng hiển thị và khắc phục sự cố nhanh hơn. Bắt đầu thử nghiệm miễn phí ngay hôm nay.
Nếu bạn đã sử dụng toán tử Null Coalescing trong quá khứ, có lẽ bạn cũng nhận thấy những thiếu sót của nó: Null Coalescing không hoạt động trên các cuộc gọi phương thức. Thay vào đó, bạn cần kiểm tra trung gian hoặc dựa vào người trợ giúp
$item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
1 được cung cấp bởi một số khung:$startDate = $booking->getStartDate[];
$dateAsString = $startDate ? $startDate->asDateTimeString[] : null;
Toán tử Nullsafe cung cấp chức năng tương tự như Null Coalescing, nhưng cũng hỗ trợ các cuộc gọi phương thức. Thay vì viết bài này:
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
Php 8 cho phép bạn viết bài này:
$country = $session?->user?->getAddress[]?->country;
Chúng ta hãy xem những gì nhà điều hành mới này có thể và không thể làm!
# Nullsafe Toán tử chuyên sâu
Hãy bắt đầu bằng cách giải quyết câu hỏi quan trọng nhất: Chính xác thì sự khác biệt giữa toán tử kết hợp null và toán tử nullsafe là gì?
Hãy xem ví dụ này:
class Order
{
public ?Invoice $invoice = null;
}
$order = new Order[];
Ở đây chúng ta có một đối tượng
$item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
2 có mối quan hệ tùy chọn với đối tượng $item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
3. Bây giờ hãy tưởng tượng chúng tôi muốn nhận số hóa đơn [nếu hóa đơn không phải là null]. Bạn có thể làm điều này cả với nhà điều hành Null Coalescing và nhà điều hành Nullsafe:$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
0Vậy sự khác biệt là gì? Mặc dù bạn có thể sử dụng cả hai toán tử để đạt được kết quả tương tự trong ví dụ này, nhưng chúng cũng có các trường hợp cạnh cụ thể chỉ một trong số chúng có thể xử lý. Ví dụ: bạn có thể sử dụng toán tử Null Coalescing kết hợp với các phím mảng, trong khi toán tử Nullsafe không thể xử lý chúng:
$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
1$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
2Mặt khác, nhà điều hành Nullsafe có thể làm việc với các cuộc gọi phương thức, trong khi người vận hành Null kết hợp không thể. Hãy tưởng tượng một đối tượng
$item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
3 như vậy:$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
3Bạn có thể sử dụng toán tử nullsafe để gọi
$item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
5 vào ngày của hóa đơn, ngay cả khi đó là $item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
6:$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
4Trong khi người vận hành Null kết hợp sẽ gặp sự cố:
$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
5# Ngắn mạch
Đôi khi bạn có thể sử dụng toán tử Null Coalescing hoặc Nullsafe và những lần khác bạn cần sử dụng một loại cụ thể. Sự khác biệt là toán tử nullsafe sử dụng một hình thức "ngắn mạch": Viết
$item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
7 sẽ khiến PHP nhìn vào phía bên trái của toán tử này, nếu đó là $item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
6 thì phía bên phải sẽ bị loại bỏ. Nhà điều hành Null Coalescing thực sự là một cuộc gọi $item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
9 ngụy trang trên toán hạng tay trái của nó, không hỗ trợ ngắn mạch.Thoong mạch cũng có nghĩa là khi viết một cái gì đó như thế này:
$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
6$itemCode = @$area->pickSpecificItemByType[$type]->getItemCode[];
0 sẽ chỉ được thực thi nếu $itemCode = @$area->pickSpecificItemByType[$type]->getItemCode[];
1 thực sự không phải là $item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
6.# Các nhà khai thác nullsafe
Có thể làm tổ một số cuộc gọi của toán tử nullsafe như vậy:
$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
7# Chỉ để đọc dữ liệu
Bạn không thể sử dụng toán tử nullsafe để ghi dữ liệu vào các đối tượng:
$itemCode = [!is_null[$area->pickSpecificItemByType[$type]]] ?
$area->pickSpecificItemByType[$type]->getItemCode[] : '';
8Nhận thấy một tpyo? Bạn có thể gửi PR để sửa nó. Nếu bạn muốn cập nhật những gì đang xảy ra trên blog này, bạn có thể theo dõi tôi trên Twitter hoặc đăng ký nhận bản tin của tôi:
Toán tử nullsafe chắc chắn là một mảnh ghép bị thiếu cuối cùng được thêm vào PHP. Với bản chất năng động của nó, cảm giác tốt khi có một cách đối phó suôn sẻ với
$item = $area->pickSpecificItemByType[$type];
$itemCode = [$item] ? $item->getItemCode[] : '';
6. Sự khác biệt và chồng chéo giữa toán tử nullsafe và toán tử kết hợp NULL lúc đầu cảm thấy hơi khó hiểu, nhưng tôi chắc chắn chúng ta sẽ quen với nó.Chú thích
Đối phó với NULL
Nhà điều hành nullsafe rfc
Có gì mới trong Php 8