在逻辑操作中执行所有功能

时间:2013-07-10 10:37:34

标签: php boolean-logic

我有两个函数a()b(),都返回一个布尔值。我知道一旦结果已知,就会停止对逻辑表达式的评估,但是有没有办法对两个或多个函数执行逻辑运算,使得两个函数都执行?

4 个答案:

答案 0 :(得分:2)

根据您的需要,可能成为可能(在@JakobPogulis的回答之后):

PHP:

function a() {
    print("A");
    return true;
}

function b() {
    print("B");
    return false;
}
var_dump((boolean)(intval(a()) | intval(b())));
var_dump((boolean)(intval(a()) & intval(b())));

Online demo

JavaScript的:

function a()
{
    console.log("A");
    return true;
}
function b()
{
    console.log("B");
    return false;
}
console.log(Boolean(Number(a()) & Number(b())));
console.log(Boolean(Number(a()) | Number(b())));

Online demo

答案 1 :(得分:2)

根据this comment on the PHP manual

  

一旦结果已知,就会停止对逻辑表达式的评估。   如果您不想这样,可以用min()替换or-operator,用max()替换or-operator。

所以这段代码可能对您有用,因为您可以看到在每种情况下调用所有函数,是的,您可以将它用于两个以上的函数: -

function a()
{
    echo "function a<br/>\n";
    return true;
}
function b()
{
    echo "function b<br/>\n";
    return false;
}

function c()
{
    echo "function c<br/>\n";
    return false;
}

echo min(a(), b(), c());
echo "<br/>";
echo max(a(), b(), c());
echo "<br/>";

输出: -

function a
function b
function c
(false)    
function a
function b
function c
(true)

Demo

答案 2 :(得分:0)

如果要求是两个函数都应该执行,则无法使用单个语句来保证此行为。起初你可能会认为可以使用连接或析取,但这两个结构都是 lazy ,这意味着一旦知道它们是真的(对于析取),它们将停止评估或假(为了结合)。

function a() {
    print("A");
    return true;
}

function b() {
    print("B");
    return false;
}

$disjunction = a() || b(); // prints A, not B
$conjunction = b() && a(); // prints B, not A

上述代码只会输出AB,而不会像您预期的那样输出ABBA。这是因为当一个值为真时,析取总是为真,当一个值为假时,一个连词总是为假。

<强>加成

如果出于某种原因确实需要这种行为,可以使用mapreducefilter等PHP函数来评估多个语句,最后得到一个布尔答案。虽然这需要您创建其他函数来支持评估(可以与create_function函数一起使用),并且几乎不像使用多行那么可读,如果它会变得更难调试。

答案 3 :(得分:-3)

您的意思是以下内容?

var bothTrue;

if(a() && b()) {
    bothTrue = true;
}
else {
    bothTrue = false;
}

或者“替代”具体是什么意思?