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

时间:2011-11-07 17:20:23

标签: php anonymous-function

我的目标是在if()语句中放入一些复杂的逻辑。让我们说我有一系列值,如果我的数组中的所有内容都非零,我将执行一些代码。通常情况下,我可以说$valid = trueforeach我的数组,并在找到零时设置$valid = false。然后我运行我的代码if ($valid)。或者,我可以将循环放入函数中,并将函数放在我的if()

但是我很懒,所以我宁愿不去讨论一堆有效的"我不想写一个只在一个地方使用的全新功能。

所以,让我说我有这个:

if ($q = function() { return 'foo'; }) {
  echo $q;
}
else {
  echo 'false';
}

我期待if获得'foo',其评估为真。我的闭包致力于$q并且语句执行。 $q返回字符串foo和' foo'打印出来。

相反,我收到错误Object of class Closure could not be converted to string

所以让我们试试这个:

if (function() { return false; }) {
  echo 'foo';
}
else {
  echo 'true';
}

我原以为我的功能会返回false并且' true'会被打印出来。相反,' foo'打印出来。

我这样做的方式有什么问题?它似乎在说,"是的,这肯定是一个功能!"而不是"不,因为函数评估为false。"有没有办法做我想做的事情?

5 个答案:

答案 0 :(得分:6)

function() { return false; }创建一个类型为Closure的对象,与其他类类型的new类似,请比较以下代码:

$func = function() { return false; };

$func现在是一个对象。每个对象在if子句中返回true。所以

if ($func)
{
  # true
} else {
  # will never go here.
}

您可能希望这样做:

if ($func())
{
  # true
} else {
  # false
}

将调用Closure对象$func并给它返回值。

答案 1 :(得分:3)

这两个评价为真。

您需要使函数执行以在if语句中使用它。

试试这个:

$q = function() { return false; };
if ($q()) { //should not go here.
  echo $q();
}
else {
  echo 'false';
}

演示:http://codepad.viper-7.com/Osym1s

答案 2 :(得分:2)

PHP的闭包是作为hack实现的 - Closure类型的对象。您的代码实际上是实例化此类的对象,并将其分配给$ q。在PHP中,赋值的结果是赋值,因此实际上你的代码归结为

if (new Closure()) { ... }

答案 3 :(得分:1)

当你调用echo时,你没有执行闭包,因此它试图打印出闭包,而不是闭包的结果:

echo $q();

答案 4 :(得分:0)

您正在创建匿名函数,但从不执行它。当您测试$q = function() { return 'foo'; }时,您所说的是“将此匿名函数的引用分配给$ q,如果$ q不为null则传递此测试”(PHP不是很有趣吗?)

在测试和回显$q之前,您需要调用闭包并将其结果分配给$q