2011-06-20 15 views
1

可能重复:
PHP - and/or keywords
PHP shorthand syntaxPHP速记逻辑运算符AND和OR

快速的问题。我一直在这个地方的图书馆里看到速记表达,尽管我已经是一名PHP开发人员已经有3年多了,但我很难理解下面的评估方式。

当PHP解释器遇到它时,它是如何处理下面的代码行的?

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

    $foo AND $this->bar(); 

我猜测,这是明显的条件执行 - 即第二条语句将不会得到执行,除非第一位是真的......但使用的位运算符的迷惑了我一下。

有人可以详细说明吗?

谢谢:)

+0

@戈登 - 没有不是真的。我知道&&也是和AND一样,同样也是||和OR。我想询问速记逻辑 - 它现在已经向我指出的短路评价。 – George

+1

那么,如何http://stackoverflow.com/questions/2475047/php-shorthand-syntax呢? – Gordon

+0

有人只是挂我说。你的问题究竟是什么? – George

回答

1

回来时,我正在学习PHP看完记得“做或死”式的命令并没有完全在时间了解他们,一个典型的例子是:

mysql_connect() or die('couldn\'t connect'); 

记住,条件只会如果需要运行,例如:

if (a == b && b == c) 

这里b == c只会在a = b时才被测试。相同的理论适用于或:

if (a == b || b == c) 

现在b == c将只在​​测试!= b。

在这种情况下,你是靠这个才能运行在特定条件下的命令(退出或$这个 - >巴())上。

知道...退出()是在这种情况下是一个坏主意 - 如果你退出(“出事了”)没有什么任何人都可以做,以对用户隐藏这个错误,也很可能发行其中,500内部服务器错误会更适合一个200 OK HTTP状态,我会考虑更多的东西一样:

defined('foo') OR throw new Exception('foo is not defined!'); 

在这里,你有一个机会来捕获该异常,或者至少让PHP抓住它和问题一个500的身份。

+0

嘿马特,谢谢你的回答。是的,我知道这不是最好的方法。实际上,我只是从大多数文件中摘取了CodeIgniter核心中的例子......这是一个很重视PHP 4的框架。 – George

4

我认为,这是短路评价的一种形式:http://en.wikipedia.org/wiki/Short-circuit_evaluation

实质上,评估整个表达式,解释器短路时,一旦它的某些结果。例如:

true OR do_something(); 

这个表达式永远不会调用do_something(),因为OR的第一个操作数是真实的,所以整个表达式必须是真实的。

2

比您想象的要复杂得多。 or关键字与||相同,但优先级较低。有关详细信息,请参阅corresponding PHP page

该声明的实际执行依赖于涉及逻辑运算符的单独概念:短路。这意味着,在or的情况下,如果第一条语句结果为真,则不评估第二条语句。 (由于在有条件的,例如,整个情况就没有永远需要看下半年返回true。)

1

有时你必须看起来像一个功能:

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

    return $foo && $bar; 
} 

在这种情况下,如果有的话:

$bla = test(); 
if($bla) { 
    ... do something 
} 

“......做某事”不会被执行,因为函数作为一个整体返回false。

回报$ foo的& & $巴意味着这两个变量必须是真实的,以使函数返回true。

另一方面,如果它声明:return $ foo || $酒吧;那么函数会返回true,因为至少有一个变量是真的。