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

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. C#调用SAPWebService

    其实和调用其它WebService 没有很大不同  只是不了解SAP的人 可能不太明白 SAP接口中的相关参数 //调用接口 , 创建对象 ServiceReference1.Z_IF_MM_VEND ...

  2. SpringMVC4.0以后版本返回json格式数据问题

    第一次写博文写的不好,但希望能帮助大家,有什么偏颇的地方希望大家多多斧正.在这个问题上困扰了我两天,这两天翻来覆去睡不着.一直在想这个问题.废话不多说下面进入正题. 1.创建创建web项目,加入Spr ...

  3. linux学习笔记之线程

    线程同步机制:http://www.cnblogs.com/zheng39562/p/4270019.html 一.基础知识 1:基础知识. 1,线程需要的信息有:线程ID,寄存器,栈,调度优先级和策 ...

  4. c++ 资源索引

    1.http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段  2.http://www.hotscripts.com/category/c-cpp/sc ...

  5. java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ex.activity/com.ex.activity.LoginActivity}: android.view.InflateException: Binary XML file line #1: Error inflating class

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ex.activity/com.ex.activity.L ...

  6. Java多线程编程总结(精华)

    Java多线程编程总结 2007-05-17 11:21:59 标签:多线程 java 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http ...

  7. 运算符 - PHP手册笔记

    运算符优先级 每种编程语言都有运算符,运算符要学会灵活使用. 运算符拥有不同的优先级和结合方向. <?php var_dump(1 <= 1 == 1); // true var_dump ...

  8. 【C语言】单片机上的按键检测框架

    又好久没来写blog,最近在做项目发现之前写的stm32操作都忘了,还好做了个记录,回来看了下很多忘了的就又知道怎么做了. 下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收.滤波. ...

  9. 关于KeyEvent.Callback

    keycode------------>KEYCODE_BACK,KEYCODE_MENU event.getAction------->ACTION_DOWN,ACTION_UP,ACT ...

  10. MEMS加速度计工作原理

    一般加速度计有两块芯片组成,一块是MEMS传感器,另一块是客户化的信号处理芯片. 加速度计也称惯性传感器,因为它的工作原理就是靠MEMS中可移动部分的惯性.由于中间电容板的质量很大,而且它是一种悬臂构 ...