Tôi biết đó là một chủ đề cũ nhưng vẫn còn. Tôi vừa gặp sự cố trong mã mà tôi đang gỡ lỗi tại nơi làm việc và có thể ai đó có thể gặp sự cố tương tự ...
Giả sử mã trông như thế này:
$positions = $this->positions() || [];
Bạn sẽ mong đợi (như bạn đã quen với javascript) rằng khi $ this-> Position () trả về false hoặc null, $ position là mảng trống. Nhưng nó không phải. Giá trị TRUE hoặc FALSE phụ thuộc vào giá trị mà $ this-> position () trả về.
Nếu bạn cần nhận giá trị $ this-> position () hoặc mảng trống, bạn phải sử dụng:
$positions = $this->positions() or [];
BIÊN TẬP:
Ví dụ trên không hoạt động như dự định nhưng sự thật là như vậy ||
và or
không giống như vậy ... Hãy thử điều này:
<?php
function returnEmpty()
{
//return "string";
//return [1];
return null;
}
$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];
var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";
Đây là kết quả:
bool(false)
NULL
array(0) {
}
Vì vậy, thực sự tùy chọn thứ ba ?:
là giải pháp chính xác khi bạn muốn đặt giá trị trả về hoặc mảng trống.
$positions = $this->positions() ?: [];
Đã thử nghiệm với PHP 7.2.1
$e = true || $x = 'foo'
sẽ không xác định$x
vì đoản mạch, không phải vì mức độ ưu tiên cao hơn.