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