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 ,怎么可以正常的做为判断条件了呢?
看到的各位不妨探讨下.
随机推荐
- sql一些命令
1.创建表 create table tSId ( tSid int identity(1,1) primary key, tSName varchar(10) check(len(tSName)&g ...
- U - stl 的 优先队列 Ⅰ
Description Given m sequences, each contains n non-negative integer. Now we may select one number fr ...
- Ubuntu安装tftp服务器
一.安装如下软件包: sudo apt-get install xinetd tftpd tftp 二.在/etc/xinetd.d/目录下创建tftp文件,并输入如下内容. 执行命令:sudo vi ...
- 认识Java数组(一)
特别想喜欢一个寓言故事: 噢,它明白了,河水既没有牛伯伯说的那么浅,也没有小松鼠说的那么深,只有自己亲自试过才知道!道听途说永远只能看到表面现象,只有亲自试过了,才知道它的深浅!!!!! 言归正传: ...
- 关于serialVersionUID的说明
1.为什么要使用serialVersionUID (1)对于实现了Serializable接口的类,可以将其序列化输出至磁盘文件中,同时会将其serialVersionUID输出到文件中. (2)然后 ...
- Yii 2.0安装
通过 Composer 安装 注意: php版本最好在5.5以上! 1.下载 Yii2的高级应用程序模板 ,然后将其解压缩到一个Web可访问的文件夹. 2.下载Composer-Setup.exe , ...
- bokeh-scala
使用bokeh-scala进行数据可视化 目录 前言 bokeh简介及胡扯 bokeh-scala基本代码 我的封装 总结 一.前言 最近在使用spark集群以及geotrellis框架(相关文章见h ...
- mariadb启动
systemctl start mariadb.service #启动MariaDBsystemctl stop mariadb.service #停止MariaDBsystemctl restart ...
- OSCHina技术导向:Java模板引擎velocity
OSChina 采用 velocity 作为页面模板 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template langua ...
- poj 2425 A Chess Game_sg函数
题意:给你一个有向无环图,再给你图上的棋子,每人每次只能移动一个棋子,当轮到你不能移动棋子是就输了,棋子可以同时在一个点 比赛时就差这题没ak,做了几天博弈终于搞懂了. #include <io ...