PHP闭包在IF语句中返回什么?

PHP闭包在IF语句中返回什么?,php,anonymous-function,Php,Anonymous Function,我的目标是在if()语句中加入一些复杂的逻辑。假设我有一个值数组,如果数组中的所有值都不是零,我将执行一些代码。通常,我可以说,$valid=true,foreach我的数组,并在找到零时设置$valid=false。然后,如果($valid),我将运行我的代码。或者,我可以将我的循环放入一个函数,并将该函数放入我的if() 但我很懒,所以我不想乱搞一堆“有效”标志,也不想编写一个只在一个地方使用的全新函数 假设我有这个: if ($q = function() { return 'foo';

我的目标是在if()语句中加入一些复杂的逻辑。假设我有一个值数组,如果数组中的所有值都不是零,我将执行一些代码。通常,我可以说,
$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()就是我想要的。