Php If(x或y)性能

Php If(x或y)性能,php,performance,if-statement,Php,Performance,If Statement,我有一个与性能相关的问题,关于PHP如何在条件表达式中计算OR运算符 我有一个条件调用2个函数,都返回布尔值: 第一个是一个简单、快速的函数——simpleFunction 第二个是查询DB-intensiveFunction的更密集的函数 我可以这样编写条件,这样,如果第一个简单函数返回TRUE,第二个更密集的函数将不会执行: if ( simpleFunction() ) { // Do Stuff } elseif ( intensiveFunction() ) { // Do

我有一个与性能相关的问题,关于PHP如何在条件表达式中计算OR运算符

我有一个条件调用2个函数,都返回布尔值:

第一个是一个简单、快速的函数——simpleFunction

第二个是查询DB-intensiveFunction的更密集的函数

我可以这样编写条件,这样,如果第一个简单函数返回TRUE,第二个更密集的函数将不会执行:

if ( simpleFunction() ) {
   // Do Stuff
} elseif ( intensiveFunction() ) {
   // Do the same stuff (redundant code)
}
<pre>
<?php
function test($bool) {
    echo "I was executed\n";

    return $bool;
}

echo "<b>||-Operator</b>\n";
if (test(true) || test(true)) {
    ;
}

echo "<b>|-Operator</b>\n";
if (test(true) | test(true)) {
    ;
}

echo "<b>or-Operator</b>\n";
if (test(true) or test(true)) {
    ;
}

echo "<b>&&-Operator</b>\n";
if (test(false) && test(true)) {
    ;
}

echo "<b>&-Operator</b>\n";
if (test(false) & test(true)) {
    ;
}

echo "<b>and-Operator</b>\n";
if (test(false) and test(true)) {
    ;
}
?>
</pre>
我的问题是,在PHP条件中使用and或运算符时,如果运算符左侧的第一个条件为TRUE,是否会执行运算符右侧的第二个函数

if ( simpleFunction() || intensiveFunction() ) {
    //Do Stuff
}
这个条件将在循环中运行,所以我希望避免在每次迭代中运行IntensifiveFunction

我相信,一旦在or操作中找到了一个truthy,那么语句就会结束并返回true


而在and操作中,它会一直运行,直到找到错误。

正如Neal指出的,我应该测试一下:

$hasRun = 'Intesive Function Has NOT Run';

function simpleFunction() {
    return TRUE;    
}

function intensiveFunction() {
    $hasRun = 'Intesive Function Has Run';  
    return TRUE;
}

if ( simpleFunction() || intensiveFunction() ) {
    echo $hasRun;   
}

//Result: Intesive Function Has NOT Run function

因此,是的,一旦第一个条件返回TRUE,则条件退出,而第二个条件不被计算。

另外,比较此脚本测试各种逻辑运算符:


请注意| and&始终执行第二部分,即使输出不能再为true&-运算符或不能再为false |运算符。

为什么不进行测试并查看?答案是否定的。如果两个&&表达式中的第一个计算结果为false,则相同。也称为短路或懒惰evaluation@Neal-当然可以。我想不出一个合乎逻辑的方法来测试这个,但我突然想到了一个。我会贴证明的。不要相信,一定要。
||-Operator
I was executed
|-Operator
I was executed
I was executed
or-Operator
I was executed
&&-Operator
I was executed
&-Operator
I was executed
I was executed
and-Operator
I was executed