【问题标题】:PHP and closuresPHP 和闭包
【发布时间】:2011-12-18 15:49:16
【问题描述】:

大量使用 JS 我开始喜欢闭包,所以我很高兴得知 PHP 中也有闭包。但是我就是无法让这些东西工作,这段代码有什么问题?

class Foo {
    public $Bar;
    public function Foo() {
        $this->Bar = function() { echo "Hello World"; };
    }
};

$F = new Foo();
$F->Bar();

我不断收到PHP Fatal error: Call to undefined method Foo::Bar() 错误。

【问题讨论】:

  • (a) 你拥有的是一个匿名函数,而不是一个闭包。 (b) 您使用的是哪个 PHP 版本?这是在 PHP 5.3 中引入的。
  • 我认为它必须 >=5.3,否则会出现解析错误
  • @jlb:对,刚刚注意到..
  • 哎呀,这就是我的意思,然后菲利克斯;)我在版本 5.3.6
  • 仅供参考:一个 php 类可以具有同名的属性和函数,因此尝试通过 $this->propname() 将属性作为函数访问不符合规则。

标签: php closures


【解决方案1】:

这已经在 SO 上进行了很多讨论(参见例如this answer)。这应该可以解决问题:

$b = $f->Bar;
$b();

是的,就是这么愚蠢。你可以使用call_user_func() 放入一行(见jlb's answer to this question),但丑陋仍然存在。

【讨论】:

  • 不错。这么多 PHP 的类系统感觉非常“临时”,至少您需要这样的解决方法这一事实本身并不令人意外......
  • @KerrekSB 我同意。这两行代码令人厌恶。
  • 是的,这两行是可憎的......试试我的解决方案:)
  • @jlb 基本相同,但在一行中。并没有说明$f->Bar() 不能更好地工作。 ://
  • @jlb 是的,但是为什么需要调用另一个函数(即call_user_func)才能调用自己的函数?因为您必须解决 php.ini 的可笑缺点。这真是难过;这真是伤心。不是你的,而是 php 的。
【解决方案2】:

如果你想用单线解决方案来代替

$F->Bar()

试试这个:

call_user_func($F->Bar);

【讨论】:

    【解决方案3】:

    PHP 将方法和字段分开。其实可以同时拥有一个方法和一个同名的字段:

    class Foo {
        public $Bar;
        function Bar() { echo "hello\n"; }
    };
    
    $F = new Foo();
    $F->Bar = 42;
    $F->Bar(); // echoes "hello"
    

    因此您可以看到,为避免歧义,在调用具有该名称的方法和访问具有该名称的字段然后将其作为函数调用之间必须有单独的语法。

    如果 PHP 有更好的语法,他们会支持($F->Bar)(),即任何表达式的函数调用运算符,但目前只能“调用”变量。

    【讨论】:

      【解决方案4】:

      PHP 不喜欢使用 $F->Bar 表示法来访问闭包。

      如果你稍微改变一下

      $t = $F->Bar();
      $t();
      

      然后就可以了。

      【讨论】:

        猜你喜欢
        • 2011-10-04
        • 2011-05-03
        • 2016-04-06
        • 2013-03-19
        • 2017-02-13
        • 1970-01-01
        • 2012-07-20
        • 2011-05-05
        • 2017-02-12
        相关资源
        最近更新 更多