是否可以使用速記三元來檢查變量是否已設置,而不是是否計算結果為零或非零?
例如,我試過:
$var = 0;
echo (string) $var ?: (string) false ?: 2;
但由于前兩個表達式的計算結果均為“0”或“false”,因此顯示為 2。
我認為也許將它們轉換為字符串會產生不同的結果,但事實并非如此。我想零就是零。
我想在分配變量時使用這種樣式,例如
$get->var = $get->var ?: $setindb ?: $default;
如果設置了$get->var,我想將$get->var分配給$get->var,否則,檢查db是否有值,否則,使用默認值。
我想我會提到我知道我可以做類似的事情
$get->var = (!empty($get->var)) ? $get->var : ( (!empty($setindb)) ? $setindb : $default )
但你來判斷哪個更簡單:)
【問題討論】:
-
為什么不使用 isset($get->var) 代替?
-
好吧,在我上面的例子中,不是空的, isset 會更合適,但這仍然讓我處于同樣的情況。我一直在尋找一種更清潔、更簡單的方法。
【解決方案1】:
字符串“0”和“false”在 PHP 中被視為?FALSE
-y (list of false values) 值。
isset()
?為已設置的變量返回?TRUE
?而不是?NULL
。?empty()
?將檢查變量是否已設置,并且該變量不是?FALSE
?值。所以它會為“0”返回TRUE
。
我認為你想要的是你的第三個代碼 sn-p,但使用isset()
,而不是empty()
。
最簡單的方法(使用最少的括號)是:
$get->var = isset($get->var) ? $get->var : (isset($setindb) ? $setindb : $default);
由于速記三元返回第一個參數,你不能使用它,因為那將是一個布爾值。 (isset($get->var) ?: $default
?將返回?TRUE
、FALSE
?或?$default
,但絕不會返回?$get->var
?的值。)
編輯:也許你想要一個像合并函數這樣的東西?據我所知,PHP 本身并不提供它,但創建起來很簡單。請注意,這可能有點難看,因為它使用傳遞對函數的引用。我會對這方面的 cmets 感興趣(它有我想的那么糟糕嗎?)。
function coalesce(array $values)
{foreach($values as &$value){if(isset($value))return $value;}return null;
}
$this->var = coalesce(array(&$this->var, &$setindb, $default));
我還沒有測試過上述內容。將數組中的變量作為引用傳遞(&
?符號)。我很確定它會被?coalesce(array(1,"a_string",false));
?這樣的東西窒息。
【討論】:
-
好的,不知道是否有一些技巧(比如強制轉換)三元會檢查除真假以外的技巧
empty()和isset()的區別及應用場景:
a.當判斷一個變量是否定義時,可用isset();
應用:表單提交時用isset($_POST['submit'])的值來判定是否提交表單。
b.當判斷一個變量是否為空時(不需要知道其是否賦值),可用empty();
應用:表單驗證時,需驗證必填項值是否為空。
c.當判斷一個變量已經存在且不為空,可先用isset(),再用empty();
應用:文件上傳時,需判斷$_FILES已賦值,且不為空。
?