У меня есть следующий код в PHP5.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: Кроме того, не будет спецификация потребуйте, чтобы это работало, как я ожидал:
Анонимная функция, определенная внутри экземпляра или статического метода, имеет область видимости, установленную для класса, в котором она была определена. В противном случае анонимная функция не имеет области видимости.
РЕДАКТИРОВАТЬ 2: Обратите внимание, что когда я удаляю static
модификатор из Guy::test()
и называть это как (new Child)->test();
выход, как и ожидалось.
РЕДАКТИРОВАТЬ 3: Ожидая некоторого еще более странного поведения, я думаю, что это реальная ошибка в PHP -> в соответствии с сообщением об ошибке
Child наследует функцию test (), поэтому область действия анонимной функции — Child, то есть «класс, в котором она была определена».
Других решений пока нет …