追溯代码时遇到这个坑,一直是略有懵懂,那就填了这个坑.

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 .

充电完毕;

二 例子

 $a1 = true;
$a2 = false; $b1 = true;
$b2 = false; var_dump($a1 AND $a2); //false
var_dump($a1 && $a2); //false var_dump($a1 OR $a2); //true
var_dump($a1 || $a2); //true

跟预想的一样.那么坑在哪里

  $a = $a1 OR $a2;    //true  
$a = $a2 OR $a1;    //false 坑1
$a = $a1 || $a2;     //true $b = $b1 AND $b2; //true
$b = $b2 AND $b1; //false 坑2
$b = $b1 && $b2; //false

所以一定注意啊,逻辑判断的时候放好括号啊

三  回到咱们的代码里


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

'=' 在file_exists()的括号内,绝对没有其他'=' 来扰乱判断结果.那么关注点就是短路了. 短路:在OR逻辑中,有1个为true,则结果为true,另外一个不再进行运算.
 短路运用
defined('ENV') or die('env not defined!');
defined('ENV') or define('ENV','DEVELOP');


AND 理论上没有短路,因为需要至少两个条件都为真,才成立. 后面的条件是判断的一部分,不能作为短路语句使用了. 

四. 坑.
 
and && OR || 在作为判断条件的时候由于跟=优先级的问题,不可避免的会是一个坑.
 举例:
$a = 0;
$b = 0;
if ($a =4 || $b =5){
  echo $a,$b;
}

因为 || 优先级大于 = ,计算顺序如下

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

思考:

  我理解中,计算完第一步之后,条件expr 变为 $a = true = 5 ,这毫无疑问是一个syntax error ,怎么可以正常的做为判断条件了呢?

  看到的各位不妨探讨下.

随机推荐

  1. 大数值基础、for与while循环的简单对比

  2. 【.NetRemoting-3】2015.09.18

    [Remoting程序的基本实现] [一]服务程序集 [1]服务对象必须要求继承[MBR,MarshalByRefObject] [二]服务端应用程序 [1]注册通道 [两种类型的通道] [A]发送请 ...

  3. Python中安装numpy,scipy,matplotlib安装方法

    这个吧,说简单也简单,说难吧我捣鼓了两天才弄出来,真是头发都急白了.其实只要一个网址就搞定了,嘿嘿 http://www.lfd.uci.edu 这里面有你需要的任何东西,当你运行python imp ...

  4. Angular中Controller之间的信息传递(第二种办法):$emit,$broadcast,$on

    $emit只能向parent controller传递event与data( $emit(name, args) ) $broadcast只能向child controller传递event与data ...

  5. Dom4j使用Xpath语法读取xml节点

    我们可以使用Xpath的语法来轻易的读取xml的某个节点[类似于jQuery的选择器]: 使用Xpath语法需要添加新的jaxen-1.1-beta-7.rar 这个jar包 dom4j完整jar包我 ...

  6. Python网页信息采集:使用PhantomJS采集淘宝天猫商品内容

    1,引言 最近一直在看Scrapy 爬虫框架,并尝试使用Scrapy框架写一个可以实现网页信息采集的简单的小程序.尝试过程中遇到了很多小问题,希望大家多多指教. 本文主要介绍如何使用Scrapy结合P ...

  7. sublime 控制台输入解决方案

    下面的配置是通过konsole控制台自带的参数解决了sublime不能输入的问题,这种方式适合任何一种语言 { "cmd": ["konsole"," ...

  8. 自动生成XML空节点格式的差异

    我们用C#开发了上位机配置软件,用C开发了嵌入式软件,然后他们之间的参数交互靠XML文件来沟通. C#中添加一个空的节点有以下几种情况. 不给节点的InnerText赋值: <root> ...

  9. CodeForces 214B Hometask

    本题求n个数组成的大数,要求是2,3,5的倍数. 因为是2 和5 的倍数,所以个位为 0:所以若n个数中没有0,直接输出-1: 难点就是要求为3 的倍数. 因为若某个数为3的倍数,则其各位数的和必然是 ...

  10. sql server遍历表不用游标和临时表的方法

    表结果如图 )) ,'Sky,Blue,Water' ,'Book,Apple,Shirt' ,'Cup,Yellow,org' ,'box,phone,paper' GO SELECT id,SUB ...