【问题标题】:What do PHP closures return in IF statements?PHP 闭包在 IF 语句中返回什么?
【发布时间】:2011-11-07 17:20:23
【问题描述】:

我的目标是在 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'。

我这样做的方式有什么问题?似乎它在说,“是的,这确实是一个函数!”而不是“不,因为函数评估为假”。有没有办法做我想做的事?

【问题讨论】:

标签: php anonymous-function


【解决方案1】:

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
}

这将调用闭包对象$func 并为其提供返回值。

【讨论】:

    【解决方案2】:

    这两个都为真。

    你需要让函数执行才能在 if 语句中使用它。

    试试这个:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        echo $q();
        

        【讨论】:

          【解决方案5】:

          您正在创建一个匿名函数,但从未执行它。当您测试$q = function() { return 'foo'; } 时,您的意思是“将对此匿名函数的引用分配给 $q,如果 $q 不为空,则通过此测试”(PHP 不是很有趣吗?)

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

          【讨论】:

            猜你喜欢
            • 2015-07-28
            • 2018-07-02
            • 2022-12-09
            • 1970-01-01
            • 1970-01-01
            • 2015-05-06
            • 1970-01-01
            • 1970-01-01
            • 2018-04-18
            相关资源
            最近更新 更多