我在php5.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中的一个真正的bug-> according bug report

最佳答案

child继承function test(),因此匿名函数的作用域是child,即“它在中定义的类”。

关于php - PHP中静态匿名函数的意外范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28385874/

10-08 21:58