簡體   English   中英

PHP 和?? 操作員

[英]PHP and ?? operator

好像有些人知道,C# 很有用?? 如果左邊的表達式是 null,則計算並返回右邊的表達式的運算符。 它對於提供默認值非常有用,例如:

int spaces = readSetting("spaces") ?? 5;

如果readSetting找不到"spaces"並返回 null,變量spaces將保持默認值5

您可以在 JavaScript 和 Ruby 中使用||執行幾乎相同的操作運算符,如

var spaces = readSetting("spaces") || 5;

盡管在這種情況下,JavaScript 中的spaces值不能為0 ,而 Ruby 和 JavaScript 中的空格值為false

PHP 有or運算符,雖然它不能用作|| 從某種意義上說,它不會從右側返回表達式,它在這里仍然很有用:

$spaces = readSetting('spaces') or $spaces = 5;

請注意,除了大多數語言中的false, 0null之外,PHP 中的"""0"也被視為false

問題是,我應該使用上面的結構嗎? 除了將大的字符 class 視為錯誤之外,它是否有副作用? PHP 社區這個任務通常使用和推薦的更好的結構嗎?

在這種情況下更明確是個好主意,尤其是在 PHP 中,因為它的類型轉換規則有些混亂(例如,正如您所指出的,“0”是錯誤的)。

如果你想嚴格,讓你的 function readSettings返回正確的設置,如果沒有找到設置,則返回一個明確定義的值,例如null 然后你應該把它用作:

$spaces = readSettings('spaces');
if (null === $spaces) {
    $spaces = 5;
}

如果您想更慷慨並且只希望 $spaces 不為空,請使用:

$spaces = readSettings('spaces');
if (empty($spaces)) {    // or:  if (!$spaces) {
    $spaces = 5;
}

您可以通過第二次 function 調用或丑陋的構造(不推薦)來縮短它:

$spaces = readSettings('space') ? readSettings('space') : 5;
$spaces = ($x = readSettings('space')) ? $x : 5;  // UGLY!

但請注意您是否希望0成為$spaces的有效值!

來自Python 的禪宗

顯式優於隱式。

在您的情況下,我建議只向readSettings()添加第二個參數$default

function readSettings($key, $default=null) {
    return isset($settings[$key]) ? $settings[$key] : $default;
}

$spaces = readSettings('spaces', 5); 

PHP 5.3.0 給出了三元運算符 condition?true:false 的較短版本,如下所示:

$spaces = readSettings('spaces') ?: 5;

請注意,PHP 5.3.0 仍處於測試階段,尚未准備好生產(雖然它已經是一個候選版本),但它提供了許多新的酷東西,如 lambda 函數和命名空間,所以檢查這些特性絕對值得!

這是一篇很好地描述了新功能的文章:

http://www.sitepoint.com/article/whats-new-php-5-3/

這個怎么樣?

$spaces = ($tmp=readSettings('space')) ? $tmp : 5;

或者,更令人困惑但只使用一個變量:

$spaces = ($spaces=readSettings('space')) ? $spaces : 5;

PHP 7 現在支持?? 作為Null 合並運算符

已添加 null 合並運算符 (??) 作為語法糖,用於需要將三元與 isset() 結合使用的常見情況。 如果存在且不是 NULL,則返回其第一個操作數; 否則返回第二個操作數。

<?php 
// Fetches the value of $_GET['user'] and returns 'nobody' 
// if it does not exist. 
$username = $_GET['user'] ?? 'nobody'; 
// This is equivalent to: 
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first 
// defined value out of $_GET['user'], $_POST['user'], and 
// 'nobody'. 
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; 
?>

http://php.net/manual/en/migration70.new-features.php

如果你想保證你得到 false 或 null,並且不將“0”之類的東西視為“false”,你可以執行以下操作:

$spaces = readSetting('spaces');
if($spaces == null || $spaces === false) $spaces = 5;

PHP 中的===運算符查找相同的匹配項,因此“0”、“”不等於 false。 顯然,您可能想根據自己的喜好重新設計代碼,但您明白了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM