我在PHP 5.6.2 中有以下代码。它有类Father
,Guy extends Father
和Child 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
答案 0 :(得分:0)
Child继承了函数test(),因此匿名函数的范围是Child,它是&#34;它在&#34;中定义的类。