的分配我嘗試這樣不影響:如何第一非虛假變量來自於一組
$a = false;
$b = false;
$c = 'sometext';
$result = $a or $b or $c or exit('error: all variables are false');
和$結果應設置爲$ C,但是這給的bool(false)
值來代替。
的分配我嘗試這樣不影響:如何第一非虛假變量來自於一組
$a = false;
$b = false;
$c = 'sometext';
$result = $a or $b or $c or exit('error: all variables are false');
和$結果應設置爲$ C,但是這給的bool(false)
值來代替。
有幾件事情會在這裏:
首先,在PHP中的布爾運算的結果是一個布爾值。
第二,更巧妙的是,「英語」布爾操作符(or
和and
)具有低precedence - 比賦值運算符,=
更低。
因此,在這種表達$result
總是會得到的$一個(無論$a
的值)的實際值,因爲布爾運算符前應用分配。
// This has the same effect:
$result = $a or $b or $c;
// As this:
$result = $a;
$a or $b or $c; // this has no effect
這是令人困惑的,而且幾乎肯定不是你想要的。
要獲得是否有任何的$a
,$b
,$c
是truthy(即true
,或澆注到true
)布爾結果,你可以用小括號強制優先級,或使用「C式」運營商(||
和&&
)有較高的優先級:
// These all have the same effect:
$result = ($a or $b or $c);
$result = $a || $b || $c;
if ($a or $b or $c)
$result = true;
else
$result = false;
if ($a || $b || $c)
$result = true;
else
$result = false;
如果你不確定運算符優先級,最好使用括號 - 他們也往往有助於使代碼更易讀,因爲計算的順序是由更明顯。
不依賴隱式類型轉換(尤其是轉換非數字字符串)通常也會更好,因爲它往往會導致代碼不清晰。
編輯:
要回答這個問題實際,另一種方法(雖然我真的不推薦它在這種情況下,既然你說你只在第一個非假值興趣)將在沒有回調的情況下使用array_filter
- 這將返回一個數組全部輸入數組中的值爲truthy,保留鍵。
如:
$a = false;
$b = false;
$c = 'sometext';
$result = array_filter(array($a, $b, $c));
var_dump($result);
輸出:
array(1) {
[2]=>
string(8) "sometext"
}
($result = $a) || ($result = $b) || ($result = $c) || exit("no");
,或者如果你想在0和空字符串等不能算作虛假:
(($result = $a) !== false) || (($result = $b) !== false) || (($result = $c) !== false) || exit("no");
想想這是否是真的可讀。你也可以使用老式的方式:
if ($a !== false)
$result = $a;
elseif ($b !== false)
$result = $b;
elseif ($c !== false)
$result = $c;
else
exit("no");
編輯:以防萬一你需要動態的東西;-)。
foreach(array('a','b','c') as $key)
if (($result = $$key) !== false)
break;
if ($result === false)
exit("no");
布爾運算符的結果在php中是boolean。
$a = false;
$b = false;
$c = 'sometext';
$result = null;
foreach(array('a', 'b', 'c') as $k)
{
if($$k !== false)
{
$result = $$k;
break;
}
}
另外,考慮將您的變量移動到數組中。
什麼:
$result = $a ?: $b ?: $c ?: exit('doh!');
這也許應該是接受的答案。 –
所以我看有沒有更好的方式... $ what_if_my_variable_is_very_very_long_and_descriptive_which_is_good_programming_practice – rsk82