Nhiều ngôn ngữ lập trình có chức năng kết hợp (trả về giá trị không phải NULL đầu tiên, ví dụ ). Đáng buồn là PHP năm 2009 thì không.
Điều gì sẽ là một cách tốt để thực hiện một trong PHP cho đến khi chính PHP có một hàm kết hợp?
Nhiều ngôn ngữ lập trình có chức năng kết hợp (trả về giá trị không phải NULL đầu tiên, ví dụ ). Đáng buồn là PHP năm 2009 thì không.
Điều gì sẽ là một cách tốt để thực hiện một trong PHP cho đến khi chính PHP có một hàm kết hợp?
Câu trả lời:
Có một toán tử mới trong php 5.3 thực hiện điều này: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
trả về false
. Các nhà điều hành thực sự lành mạnh.
PHP 7 đã giới thiệu một toán tử hợp nhất thực sự :
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
Nếu giá trị trước ??
không tồn tại hoặc là null
giá trị sau khi ??
được lấy.
Sự cải thiện so với ?:
toán tử được đề cập là, ??
cũng xử lý các biến không xác định mà không cần ném E_NOTICE
.
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
hơn ??
là nó kết hợp các giá trị trống cũng ??
không làm được. Tương tự như hành vi của toán tử OR logic trong JavaScript (nghĩa là $val || 'default'
), tôi sẽ thấy đó ?:
là một hình thức kết hợp thực tế hơn nếu trong thực tế, chúng ta cuối cùng thấy mình xử lý cả trống và rỗng theo cùng một cách (nghĩa là $val ?: 'default'
). Và nếu bạn muốn buộc vấn đề thêm và nuốt E_NOTICE
, bạn có thể tranh luận điều này ngay cả:echo @$val ?: 'default';
Lần truy cập đầu tiên cho "php coalesce" trên google.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
Tôi thực sự thích các nhà điều hành ?: Thật không may, nó chưa được thực hiện trên môi trường sản xuất của tôi. Vì vậy, tôi sử dụng tương đương với điều này:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
coalesce
được cho là trả lại đối số không null đầu tiên mà nó gặp, bao gồm FALSE
. FALSE
Mặc dù vậy, chức năng này sẽ loại bỏ , có lẽ không phải là những gì op có trong đầu (ít nhất không phải là những gì tôi muốn từ một coalesce
chức năng).
Điều đáng chú ý là do cách xử lý của PHP đối với các biến không xác định và các chỉ số mảng, bất kỳ loại hàm kết hợp nào đều được sử dụng hạn chế. Tôi rất thích có thể làm điều này:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
Nhưng trong hầu hết các trường hợp, điều này sẽ khiến PHP bị lỗi với E_NOTICE. Cách an toàn duy nhất để kiểm tra sự tồn tại của một biến trước khi sử dụng nó là sử dụng nó trực tiếp trong khoảng trống () hoặc isset (). Toán tử ternary được đề xuất bởi Kevin là tùy chọn tốt nhất nếu bạn biết rằng tất cả các tùy chọn trong liên kết của bạn được biết là được khởi tạo.
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
).
Hãy chắc chắn rằng bạn xác định chính xác cách bạn muốn chức năng này hoạt động với một số loại nhất định. PHP có nhiều loại chức năng kiểm tra hoặc tương tự, vì vậy hãy chắc chắn rằng bạn biết chúng hoạt động như thế nào. Đây là một ví dụ so sánh giữa is_null () và blank ()
$testData = array(
'FALSE' => FALSE
,'0' => 0
,'"0"' => "0"
,'NULL' => NULL
,'array()'=> array()
,'new stdClass()' => new stdClass()
,'$undef' => $undef
);
foreach ( $testData as $key => $var )
{
echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not') . " null<br>";
echo '<hr>';
}
Như bạn có thể thấy, blank () trả về true cho tất cả những thứ này, nhưng is_null () chỉ làm như vậy cho 2 trong số chúng.
Tôi đang mở rộng câu trả lời được đăng bởi Ethan Kent . Câu trả lời đó sẽ loại bỏ các đối số không null đánh giá thành sai do hoạt động bên trong của mảng_filter , đây không phải là điều mà một coalesce
hàm thường làm. Ví dụ:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
Giáo sư
Để khắc phục điều này, một đối số thứ hai và định nghĩa hàm được yêu cầu. Hàm có thể gọi được có trách nhiệm cho array_filter
biết có thêm giá trị mảng hiện tại vào mảng kết quả hay không:
// "callable"
function not_null($i){
return !is_null($i); // strictly non-null, 'isset' possibly not as much
}
function coalesce(){
// pass callable to array_filter
return array_shift(array_filter(func_get_args(), 'not_null'));
}
Sẽ thật tuyệt nếu bạn có thể đơn giản vượt qua isset
hoặc 'isset'
làm đối số thứ 2 array_filter
, nhưng không có may mắn như vậy.
PHP 5.3+, với các bao đóng:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
Bản trình diễn: https://eval.in/187365
??
cho PHP 7.