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

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. ckplayer 项目实际应用代码整理,支持标清,高清,超清切换!

    ckplayer是个免费,小巧,功能强大的视频播放器,前段时间有个项目需要做个收费视频播放的功能,于是就用了ck,目前项目已经弄完,完美支持pc和手机端的播放,重要的是可以支持清晰度切换,最后加了个是 ...

  2. node.js 入门(一)安装

    从 https://nodejs.org/ 下载最新版的node.js 下载完成后,双击安装, 一路点击"Next"按钮即可. 等出现上图及表示安装成功. 按"win+r ...

  3. Java之定时任务详解

    在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. 在 ...

  4. jQuery工具函数上

    1.字符串操作 <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...

  5. Yii 多表关联relations,需要与with()方法联合使用

    1,首先多表关联是在models/xx.php的relations里配置的.而且是互配,但有区别. 格式: 'VarName'=>array('RelationType', 'ClassName ...

  6. 【转】aiohttp 源码解析之 request 的处理过程

    [转自 太阳尚远的博客:http://blog.yeqianfeng.me/2016/04/01/python-yield-expression/] 使用过 python 的 aiohttp 第三方库 ...

  7. Mvc中使用MvcSiteMapProvider实现站点地图之基础篇

    MvcSiteMapProvider 是针对 ASP.NET MVC 中,提供菜单. 网站地图. 站点地图路径功能,以及更多的工具.它提供配置使用一个可插入的体系结构,可以是 XML. 数据库或动态生 ...

  8. OneNote Count

    用OneNote的时候,某个分区的笔记多的话,想数一下一共有多少笔记是个麻烦的活儿. OneNote没有自带这功能 于是写了个C#的小程序实现这功能 https://github.com/02xiao ...

  9. SQL 查找某个字段的首字母

    执行以下SQL语句 SELECT ,--或得首字母出现的位置 ),--要替换的字符串 ),''),--替换后的结果 OrderId, * FROM dbo.OrderSync 得到结果如下

  10. tomcat优化-有改protocol 和 缓存 集群方案

    tomcat优化 在线上环境中我们是采用了tomcat作为Web服务器,它的处理性能直接关系到用户体验,在平时的工作和学习中,归纳出以下七种调优经验. 1. 服务器资源 服务器所能提供CPU.内存.硬 ...