我有两个函数a()
和b()
,都返回一个布尔值。我知道一旦结果已知,就会停止对逻辑表达式的评估,但是有没有办法对两个或多个函数执行逻辑运算,使得两个函数都执行?
答案 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())));
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())));
答案 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)
答案 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
。这是因为当一个值为真时,析取总是为真,当一个值为假时,一个连词总是为假。
<强>加成强>
如果出于某种原因确实需要这种行为,可以使用map
,reduce
和filter
等PHP函数来评估多个语句,最后得到一个布尔答案。虽然这需要您创建其他函数来支持评估(可以与create_function
函数一起使用),并且几乎不像使用多行那么可读,如果它会变得更难调试。
答案 3 :(得分:-3)
您的意思是以下内容?
var bothTrue;
if(a() && b()) {
bothTrue = true;
}
else {
bothTrue = false;
}
或者“替代”具体是什么意思?