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 .
充电完毕;
二 例子
$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 ,怎么可以正常的做为判断条件了呢?
看到的各位不妨探讨下.
随机推荐
- 控制器的view的加载优先级
拿到控制器后,控制器的view是在什么时候按照什么优先级创建加载的? 1.控制器内部的view是延迟加载 1> 用到时再加载(loadView) 2> 加载完毕后会调用控制器的viewDi ...
- jQuery.on() 函数详解
on() 函数用于为指定元素的一个或多个事件绑定事件处理函数. 此外,你还可以额外传递给事件处理函数一些所需的数据. 从jQuery 1.7开始,on()函数提供了绑定事件处理程序所需的所有功能,用于 ...
- <转>Python的内存泄漏及gc模块的使用分析
一般来说在 Python 中,为了解决内存泄漏问题,采用了对象引用计数,并基于引用计数实现自动垃圾回收.由于Python 有了自动垃圾回收功能,就造成了不少初学者误认为自己从此过上了好日子,不必再受内 ...
- windows查询端口
依次点击“开始→运行”,键入“cmd”并回车,打开命令提示符窗口.在命令提示符状态下键入“netstat -an”,按下回车键后就可以看到以数字形式显示的TCP和UDP连接的端口号及状态.
- Android的消息机制
一.简介 ①.我们不能在子线程中去访问UI空控件,这是时候只能通过Handler将更新UI的操作放到主线程中去执行 ②.Handler的组成:messageQueue和Looper的支持 ③.Mess ...
- Async 与 Await 关键字研究
1 Aynsc 和 Await 关键字的研究 在 .NET 4.0 以后,基于 Task 的异步编程模式大行其道,因其大大简化了异步编程所带来的大量代码工作而深受编程人员的欢迎,如果你曾 ...
- AndroidTestCase测试用法
1. Java代码TestCase.java 继承AndroidTestCase类 package com.test.casei; import android.test.AndroidTest ...
- tls和ssl
一个存在于 SSL 3.0 协议中的新漏洞于被披露,通过此漏洞,第三方可以拦截通过采用 SSL 3.0 的服务器传输的重要信息. 问题出在哪里? 与此问题相关的不是 SSL 证书本身,而是进行加密处理 ...
- jQuery.each(object, [callback])方法,用于处理json数组
通用例遍方法,可用于例遍对象和数组. 不同于例遍 jQuery 对象的 $().each() 方法,此方法可用于例遍任何对象.回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内 ...
- C语言的本质(21)——预处理之三:其它预处理特性及总结
C标准规定了几个特殊的宏,在不同的地方使用可以自动展开成不同的值,预编译程序对于在源程序中出现的这些串将用合适的值进行替换.这些宏有下面这些: __FILE__ 展开为当前源文件的文件名,是一个字符串 ...