2009-07-19 114 views

回答

17

isset()是這樣做的常用方法:

if (!isset($blah)) { 
    $blah = 'foo'; 
} 

注:您可以分配到null一個變量,它會被分配。這將產生與isset()is_null()不同的結果,因此您需要明確「未分配」的含義。請參閱Null vs. isset()。這也是您需要小心執行自動類型轉換的一種情況,即根據所需結果使用!=/=====/!==

您也可以使用布爾速記(這是Perl ||=運算符)。從PHP 5.2.x開始,並沒有像您所說的操作符。在Perl:

$a ||= $b; 

等同於:

$a = $a || $b; 

你可以做第二種形式在PHP但是PHP有大約type juggling一些時髦的規則。見Converting to boolean

當轉換爲boolean,所述 以下值被認爲是FALSE:

其他每個值都被視爲TRUE(包括任何資源)。

所以經過:

$a = 0; 
$a = $a || 5; 

$一個就等於5.同樣:

$a = 0; 
$b = ''; 
$c = $a == $b; // true 
$d = $a === $b; // false 

你要注意這些事情。

+1

$ a = isset($ a)? $ a:$ b;是第一個代碼示例 – niteria 2009-07-19 08:57:45

+0

$ a = 0的簡寫; $ a = $ a || 5; echo $ a; //布爾值TRUE – eyelidlessness 2009-07-19 09:17:51

+0

奇怪... echo $ a == 5? '真假'; // true - but - echo $ a - 1; // 0 – eyelidlessness 2009-07-19 09:20:53

0

如何使用嵌套的三元運算符?

對我來說,這是處理您的問題最簡單的方法。因爲你可以使用嵌套的三元運算符,所以如果需要的話你應該能夠添加更多的檢查。

$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ; 

這幾乎是相同數量的代碼,它應該工作..除非我誤解了你。如果是這種情況,我很抱歉。

與您發佈爲例原來的代碼比較,長度幾乎一樣:

$result = null; $result ||= check1(); $result ||= check2(); $result ||= "default"; 
- vs - 
$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ; 

嵌套三元運營商可以是一個有點混亂,所以在這裏你有意見有它:

// Is $var set? 
    $var = isset($var) ? 
     // TRUE: It is, use $var 
     $var : 
     // FALSE: $var is not set, run check1 
     ($i=check1()) ? 
     // TRUE: the function check1 returned valid data 
     $i : 
     // FALSE: the function check1 returned null or false, run check2 
     ($i=check2()) ? 
     // TRUE: the function check2 returned valid data 
     $i : 
     // FALSE: the function check1 returned null or false, set default value 
     "default" ; 
14
isset($foo) || $foo = 'bar'; 
0

我還沒試過呢,但是想玩多少年了。

5

從PHP 5.3,你可以使用:

$result = $result ?: check1(); 
1

我想出了這個功能,它有小人了無用的未定義的變量聲明的一個附帶好處。它足夠接近Javascript對我的行爲:

function default_value(&$var, $default) { 
    return isset($var) ? $var : $default; 
} 

$want_something = default_value($_POST['mightbeunset'], false); 
相關問題