周五一朋友來著一段代碼來問我,說他看不懂這段代碼,覺得這段代碼有問題,代碼類似:
代碼如下 復制代碼$array1 = array(1, 2);
$array2 = array(3, 4);
$result = empty($array1) == 3 ? $array1 : $array2;
我一看應該是運算符優先級的問題。
按理說,這些運算符優先級的問題是不應該讓它出現在項目代碼中的,只能讓它在面試問題中,程序員應該在書寫代碼過程中使用括號來避免這種不確定問題的出現。項目中的代碼應該是那種我們一看就知道結果的,而不是需要我們費勁腦子才能知道結果的。這種優先級代碼的結果有時候並不是我們相信的那樣,看看下面的例子:
<?php
if ($a = 100 && $b = 200) {
var_dump($a, $b);
}
上面代碼也許你會認為是:
代碼如下 復制代碼 <?php但是實際上不是這樣的,實際結果是:
代碼如下 復制代碼 <?php至於為什麼會這樣?那是因為PHP並不完全遵守優先級的定義,PHP手冊上中有說明
Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.
代碼:
代碼1:
代碼如下 復制代碼<?php
$x=TRUE;
$y=FALSE;
$z=$y OR $x; ?>
代碼2:
<?php
$x=TRUE;
$y=FALSE;
$z=$y || $x;
?>
這種代碼在實際項目中是不應該出現的,都應該用下面的代碼替換:
代碼如下 復制代碼$z = ($y OR $x);
$z = ($y || $x);