php or || 和 and &&


追溯代碼時遇到這個坑,一直是略有懵懂,那就填了這個坑.

1 if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = BASEPATH.'config/'.ENVIRONMENT.'/database.php')

一  語法

  邏輯運算符.

運算符 名稱 例子 結果
AND 邏輯與 $x and $y $x 和 $y 都為 true,則返回 true
&& 邏輯與 $x && $y $x 和 $y 都為 true,則返回 true
OR 邏輯或 $x or $y $x 和 $y 至少有一個為 true,則返回 true
|| 邏輯或 $x || $y $x 和 $y 至少有一個為 true,則返回 true

  表面看兩組操作符沒有差異.但是

The reason for the two different variations of "and" and "or" operators is that they operate at different precedences. (See Operator Precedence.)

就是優先級不同啦;查優先級表看下,

                

排序 && > || > = > and > or .

充電完畢;

二 例子

 3 $a1 = true;
 4 $a2 = false;
 5 
 6 $b1 = true;
 7 $b2 = false;
 8 
 9 var_dump($a1 AND $a2);    //false
10 var_dump($a1 && $a2);    //false
11 
12 var_dump($a1 OR $a2);    //true
13 var_dump($a1 || $a2);    //true

跟預想的一樣.那么坑在哪里

1  $a = $a1 OR $a2;    //true   
2  $a = $a2 OR $a1;    //false 坑1
3  $a = $a1 || $a2;      //true 
4 
5  $b = $b1 AND $b2;         //true          
6  $b = $b2 AND $b1;         //false  坑2
7  $b = $b1 && $b2;           //false


所以一定注意啊,邏輯判斷的時候放好括號啊

三  回到咱們的代碼里

 
        
1 if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = BASEPATH.'config/'.ENVIRONMENT.'/database.php')
 
        
'=' 在file_exists()的括號內,絕對沒有其他'=' 來擾亂判斷結果.那么關注點就是短路了. 短路:在OR邏輯中,有1個為true,則結果為true,另外一個不再進行運算.
1 短路運用 
2 defined('ENV') or die('env not defined!');
3 defined('ENV') or define('ENV','DEVELOP');
 
        
 
        
AND 理論上沒有短路,因為需要至少兩個條件都為真,才成立. 后面的條件是判斷的一部分,不能作為短路語句使用了. 

四. 坑.
 
and && OR || 在作為判斷條件的時候由於跟=優先級的問題,不可避免的會是一個坑.

1 舉例:
2 $a = 0;
3 $b = 0;
4 if ($a =4 || $b =5){
5   echo $a,$b;
6 }
 
        
因為 || 優先級大於 = ,計算順序如下

1. 1 || $b //always true
2. $a = true, 返回 $b=5 不執行計算.

思考:

  我理解中,計算完第一步之后,條件expr 變為 $a = true = 5 ,這毫無疑問是一個syntax error ,怎么可以正常的做為判斷條件了呢?

  看到的各位不妨探討下.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM