Nếu bạn đã sử dụng trong quá khứ, có lẽ bạn cũng nhận thấy những thiếu sót của nó. hợp nhất null 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
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
3 đượ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ư hợp nhất null, nhưng cũng hỗ trợ các lệnh gọi phương thức. Thay vì viết cá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 cái này
$country = $session?->user?->getAddress[]?->country;
Chúng ta hãy xem toán tử mới này có thể và không thể làm gì
Toán tử Nullsafe 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ử hợp nhất 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ó đối tượng
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
4 có quan hệ tùy chọn với đối tượng $country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
5. Bây giờ, hãy tưởng tượng chúng tôi muốn lấy số của hóa đơn [nếu hóa đơn không phải là null]. Bạn có thể làm điều này với cả toán tử hợp nhất null và toán tử nullsafevar_dump[$order->invoice?->number];
var_dump[$order->invoice->number ?? null];
Vậy sự khác biệt là gì? . Ví dụ: bạn có thể sử dụng toán tử hợp nhất null kết hợp với các khóa mảng, trong khi toán tử nullsafe không thể xử lý chúng
$array = [];
var_dump[$array['key']->foo ?? null];
var_dump[$array['key']?->foo];
Warning: Undefined array key "key"
Mặt khác, toán tử nullsafe có thể hoạt động với các lệnh gọi phương thức, trong khi toán tử hợp nhất null không thể. Hãy tưởng tượng một đối tượng
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
5 như vậy$startDate = $booking->getStartDate[];
$dateAsString = $startDate ? $startDate->asDateTimeString[] : null;
1Bạn có thể sử dụng toán tử nullsafe để gọi
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
7 vào ngày lập hóa đơn, ngay cả khi đó là ngày $country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
8$startDate = $booking->getStartDate[];
$dateAsString = $startDate ? $startDate->asDateTimeString[] : null;
4Trong khi toán tử hợp nhất null sẽ sụp đổ
$startDate = $booking->getStartDate[];
$dateAsString = $startDate ? $startDate->asDateTimeString[] : null;
5Xem video mới nhất của tôi
PHP trong 1 phút
ngắn mạch
Đôi khi, bạn có thể sử dụng toán tử kết hợp null hoặc nullsafe và những lúc khác, bạn cần sử dụng một toán tử cụ thể. Sự khác biệt là toán tử nullsafe sử dụng một dạng "đoản mạch". viết
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
9 sẽ khiến PHP xem xét những gì ở phía bên trái của toán tử này, nếu đó là $country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
8 thì phía bên tay phải sẽ bị loại bỏ. Toán tử kết hợp null thực sự là một lệnh gọi $country = $session?->user?->getAddress[]?->country;
1 ngụy trang trên toán hạng bên trái của nó, không hỗ trợ đoản mạchĐoản mạch cũng có nghĩa là khi viết một cái gì đó như thế này
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
0$country = $session?->user?->getAddress[]?->country;
2 sẽ chỉ được thực hiện nếu $country = $session?->user?->getAddress[]?->country;
3 thực sự không phải là $country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
8Toán tử nullsafe lồng nhau
Có thể lồng một số lệnh gọi toán tử nullsafe như vậy
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
1Chỉ để đọc dữ liệu
Bạn không thể sử dụng toán tử nullsafe để ghi dữ liệu vào đối tượng
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
2Nhận thấy một tpyo? . Nếu bạn muốn cập nhật những gì đang diễn 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. Đăng ký email
Toán tử nullsafe chắc chắn là mảnh ghép còn thiếu cuối cùng đã được thêm vào trong PHP. Với bản chất năng động của nó, thật tốt khi có một cách giải quyết suôn sẻ với
$country = null;
if [$session !== null] {
$user = $session->user;
if [$user !== null] {
$address = $user->getAddress[];
if [$address !== null] {
$country = $address->country;
}
}
}
8. Sự khác biệt và trùng lặp 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 rằng chúng ta sẽ quen với nó