Неожиданный объем статической анонимной функции в переполнении стека

У меня есть следующий код в 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 -> в соответствии с сообщением об ошибке

3

Решение

Child наследует функцию test (), поэтому область действия анонимной функции — Child, то есть «класс, в котором она была определена».

0

Другие решения

Других решений пока нет …