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 ,怎么可以正常的做为判断条件了呢?
看到的各位不妨探讨下.
随机推荐
- nodejs中的 Cannot read property'text' of undefined 问题
接触nodejs时间不久,最近遇到了这个问题,经过查阅资料以及百度终于解决了.
- C++标准库之泛型算法
本文中算法都是指泛型算法. 基本要点: 1)算法使用迭代器进行操作. 2)不依赖容器,但容器希望使用算法,就必须提供接口. 3)通用算法永远不会执行容器操作.操作仅指:更改容器大小的操作.但,容器内部 ...
- MySql小知识点
1.查看MySql是什么编码 show create table tablename;
- java中静态代码块的用法 static用法详解
(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...
- 1021 Fibonacci Again (hdoj)
Problem Description There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) ...
- App_Code
App_Code,文件夹是·NET平台下.在创建网站时,系统为类自动放的位置.它位于Web应用程序根目录下,其存储所有应当作为应用程序的一部分动态编译的类文件.这些类文件自 动链接到应用程序,而不需要 ...
- Vector, ArrayList, Array
JAVA新手在使用JAVA的时候大概都会遇到这个问题: JAVA中的Array, ArrayList, Vector, List, LinkedList有什么样的区别?尤其是Vector, Array ...
- Easyui tabs学习
前端时间花了一些时间学习easy ui,这个东西非常好用,界面也很美观,你都不需要在界面上花太多的工夫,例子程序也比较完善,基本上看下例子就能很好的使用easyui了,很方便. 特地分享一些使用时候遇 ...
- GIS 相关知识扫盲
1.什么是GIS GIS:地理信息系统,它是一种特定的十分重要的空间信息系统.它是在计算机硬.软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集.储存.管理.运算.分析 ...
- (转载博文)MFC 窗口句柄获取
句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息.处理程序):0.获取所在类窗口的句柄: this->m_hwnd 1.主窗口的句柄: 无论在主窗口类内,还是子窗口类内,获取主窗口句柄 ...