PHP速记逻辑运算符和或

PHP速记逻辑运算符和或,php,logical-operators,Php,Logical Operators,可能的重复项: 快速提问。我一直在各地的库中看到速记表达式,尽管我已经做了3年多的PHP开发人员,但我还是很难理解下面的内容将如何评估 当PHP解释器遇到以下代码行时,它会对这些代码行做什么 <?php defined('foo') OR exit('foo is not defined!'); $foo AND $this->bar(); 我认为这是短路评估的一种形式: 本质上,当计算整个表达式时,一旦确定结果,解释器就会短路。例如: true OR do_

可能的重复项:

快速提问。我一直在各地的库中看到速记表达式,尽管我已经做了3年多的PHP开发人员,但我还是很难理解下面的内容将如何评估

当PHP解释器遇到以下代码行时,它会对这些代码行做什么

<?php
    defined('foo') OR exit('foo is not defined!');

    $foo AND $this->bar();

我认为这是短路评估的一种形式:

本质上,当计算整个表达式时,一旦确定结果,解释器就会短路。例如:

true OR do_something();
if (a == b && b == c)

此表达式从不调用do_something(),因为OR的第一个操作数为true,因此整个表达式必须为true。

比您想象的要简单得多。
关键字与
|
相同,只是优先级较低。有关详细信息,请参阅


该语句的实际执行依赖于一个涉及逻辑运算符的单独概念:短路。这意味着,在
的情况下,如果第一条语句为真,则不计算第二条语句。(例如,在条件中,整个条件将返回true,而无需查看后半部分。)

有时您的函数类似于:

function test()
{
    $foo = TRUE;
    $bar = FALSE;

    return $foo && $bar;
}
在这种情况下,如果有人这样做:

 $bla = test();
 if($bla) {
   ... do something
 }
“…do something”将不会执行,因为函数作为一个整体返回false

return$foo&&$bar意味着两个变量都必须为true才能使函数返回true


另一方面,如果声明:return$foo | |$bar;然后函数将返回true,因为至少有一个变量为true。

在我学习PHP时,我记得读过'do or die'样式的命令,但当时没有完全理解它们,典型的例子是:

mysql_connect() or die('couldn\'t connect');
请记住,这些条件只有在需要时才会运行,例如:

true OR do_something();
if (a == b && b == c)
这里,只有当a==b时,才会测试b==c。同样的理论适用于或:

if (a == b || b == c)
现在b==c只在a!=b

在这种情况下,在某些情况下,您依赖此命令来运行命令(exit或$this->bar()

<强> > <强> Ext()在这种情况下是一个坏主意——如果您退出(“出错”),任何人都无能为力地将这个错误隐藏给用户,它也可能发出一个200 OK HTTP状态,其中500个内部服务器错误会更合适,我会考虑更类似的:

defined('foo') OR throw new Exception('foo is not defined!');
在这里,您有机会捕获异常,或者至少让PHP捕获它并发出500状态


Mat

@Gordon-不,不太可能。我知道&&和is是一样的,和| |和OR也是一样的。我在询问速记逻辑——现在已经被指出是短路评估。那么,怎么样?有人刚刚把我和这个联系起来。你的问题到底是什么?我只是指出可能的重复。顺便说一句,用那个链接回答的人不应该用那个链接回答。这应该是一个评论或投票。这就是为什么我把它复制到这里,并标记他的答案不是答案。这都是家务。嘿,马特,谢谢你的回答。是的,我知道这根本不是最好的方式。实际上,我只是从CodeIgniter核心的大多数文件中提取了这个示例。。。这是一个高度面向PHP4的框架。