PHP闭包在IF语句中返回什么?
我的目标是在if()语句中加入一些复杂的逻辑。假设我有一个值数组,如果数组中的所有值都不是零,我将执行一些代码。通常,我可以说,PHP闭包在IF语句中返回什么?,php,anonymous-function,Php,Anonymous Function,我的目标是在if()语句中加入一些复杂的逻辑。假设我有一个值数组,如果数组中的所有值都不是零,我将执行一些代码。通常,我可以说,$valid=true,foreach我的数组,并在找到零时设置$valid=false。然后,如果($valid),我将运行我的代码。或者,我可以将我的循环放入一个函数,并将该函数放入我的if() 但我很懒,所以我不想乱搞一堆“有效”标志,也不想编写一个只在一个地方使用的全新函数 假设我有这个: if ($q = function() { return 'foo';
$valid=true
,foreach
我的数组,并在找到零时设置$valid=false
。然后,如果($valid),我将运行我的代码。或者,我可以将我的循环放入一个函数,并将该函数放入我的if()
但我很懒,所以我不想乱搞一堆“有效”标志,也不想编写一个只在一个地方使用的全新函数
假设我有这个:
if ($q = function() { return 'foo'; }) {
echo $q;
}
else {
echo 'false';
}
我希望if
得到'foo'
,其计算结果为true。我的闭包提交给$q
,语句执行$q
返回字符串foo
,并打印“foo”
相反,我得到的错误是类闭包的对象无法转换为字符串
那么让我们试试这个:
if (function() { return false; }) {
echo 'foo';
}
else {
echo 'true';
}
if ($func())
{
# true
} else {
# false
}
我希望我的函数返回false,并打印“true”。相反,“foo”被打印出来
我这样做有什么不对吗?它似乎在说,“是的,那确实是一个函数!”而不是“不,因为函数的计算结果为false”。有没有办法完成我想做的事情呢?这两个函数的计算结果都为true
您需要执行函数,以便在if语句中使用它
试试这个:
$q = function() { return false; };
if ($q()) { //should not go here.
echo $q();
}
else {
echo 'false';
}
演示:function(){return false;}
创建类型为的对象,类似于new
,与其他类类型比较以下代码:
$func = function() { return false; };
$func
现在是一个对象。每个对象在if
子句中返回true。所以
if ($func)
{
# true
} else {
# will never go here.
}
您可能希望这样做:
if (function() { return false; }) {
echo 'foo';
}
else {
echo 'true';
}
if ($func())
{
# true
} else {
# false
}
它将调用闭包对象$func
并给出其返回值。调用echo
时,您没有执行闭包,因此它试图打印闭包,而不是闭包的结果:
echo $q();
您正在创建匿名函数,但从未执行它。当您测试$q=function(){return'foo';}
时,您所说的是“将此匿名函数的引用分配给$q,如果$q不为null,则通过此测试”(PHP有趣吗?)
您需要调用闭包并将其结果分配给$q
,然后才能测试和回显$q
PHP的闭包是作为hack类型的对象实现的。您的代码实际上是实例化此类的一个对象,并将其分配给$q。在PHP中,赋值的结果就是被赋值的值,因此实际上您的代码可以归结为
if (new Closure()) { ... }
您似乎混淆了函数和它们的返回值。我想我想要的是更接近if(function(){return false;}()){
,这在Javascript中显然有效,但在PHP中无效。call_user_func()就是我想要的。