PHP中的静态匿名函数的意外范围

时间:2015-02-07 18:36:49

标签: php static scope anonymous-function

我在PHP 5.6.2 中有以下代码。它有类FatherGuy extends FatherChild extends Guy。所有这些类都有一个静态方法hi,它输出类的名称:

class Father {
  static function hi() {
    echo "Father" . PHP_EOL;
  }
}

class Guy extends Father {

  static function hi() {
    echo "Guy" . PHP_EOL;
  }

  static function test() {
    self::hi();
    static::hi();
    parent::hi();
    $anon = function() {
      self::hi();  // shouldn't this call Guy::hi()?
      static::hi();
      parent::hi();  // shouldn't this call Father::hi()?
    };
    $anon();
  }

}

class Child extends Guy {
  static function hi() {
    echo "Child" . PHP_EOL;
  }
}

Child::test();

我期望的输出是:

Guy
Child
Father
Guy
Child
Father

前三行符合预期。但最后三个令人惊讶的是:

Child //shouldn't this call Guy::hi()?
Child
Father //shouldn't this call Father::hi()?

因此,匿名函数$anon的范围似乎为Child。但它不应该与它所调用的方法具有相同的范围(即Guy)?

<小时/> 编辑1:此外,不会the specification要求此功能按预期工作:

  

在实例或静态方法中定义的匿名函数的作用域设置为它所定义的类。否则,匿名函数是未作用域的。

<小时/> 编辑2 请注意,当我从static中移除Guy::test()修饰符并将其称为(new Child)->test();时,输出符合预期。

<小时/> 编辑3:在期待一些更奇怪的行为之后,我认为这是PHP中的实际错误-> according bug report

1 个答案:

答案 0 :(得分:0)

Child继承了函数test(),因此匿名函数的范围是Child,它是&#34;它在&#34;中定义的类。