萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> 深入分析PHP運算符優先級

深入分析PHP運算符優先級

剛看PHP手冊中 Boolean 布爾類型 數據類型時,看到了評論中一個關於運算符優先級的問題,以前也講過在實際項目中不要出現這些需要人為判斷運算符優先級的代碼,都應該使用括號來規避這個問題的出現

周五一朋友來著一段代碼來問我,說他看不懂這段代碼,覺得這段代碼有問題,代碼類似:

 代碼如下 復制代碼

$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
if ($a = (100 && $b) = 200) {
     var_dump($a, $b);
}

但是實際上不是這樣的,實際結果是:

 代碼如下 復制代碼 <?php
if ($a = (100 && $b = 200)) {
     var_dump($a, $b);
}

至於為什麼會這樣?那是因為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);

copyright © 萬盛學電腦網 all rights reserved