… а возможно — баг у меня в уставшей к вечеру голове -))
Пробуйте на PHP 5.3.1, версию 5.3.2 не успел проверить.
Простейший код:
Запускаем, вполне ожидаемо получаем «test». Что и логично. Используем появившуюся недавно возможность LSB, все работает корректно.
ОК, добавим еще немного кода:
Лично у меня метод $third->test() вызывает Fatal error: undefined class constant.
Судя по выводу xdebug, интерпретатор успешно доходит до First::init(), но не находит константу First::DIR, несмотря на явно указанное использование LSB.
Что делать? Паника и адъ.
А нужно всего-лишь добавить ключевое слово «static» в определение метода First::init().
Вот такая интересная особенность.
Внимательно читая мануал, можно сделать вывод, что статический вызов методов, не определенных явно, как статические, может вызвать лишь предупреждение уровня E_STRICT.
«Calling non-static methods statically generates an E_STRICT level warning.»
Как оказалось, есть ситуации, когда пользоваться правильными ключевыми словами не только полезно, но и жизненно необходимо.
P.S. Если это мой глюк, связанный с неверным пониманием языка — очень прошу сообщить, я хочу знать в чем ошибаюсь.
Пробуйте на PHP 5.3.1, версию 5.3.2 не успел проверить.
Простейший код:
abstract class First {
function init() {
echo static::DIR;
}
}
class Second extends First {
const DIR = 'test';
}
Second::init(); //ожидаем "test"
Запускаем, вполне ожидаемо получаем «test». Что и логично. Используем появившуюся недавно возможность LSB, все работает корректно.
ОК, добавим еще немного кода:
class Third {
function test() {
Second::init(); // Второй раз ожидаем "test"
}
}
$third = new Third();
$third->test();
Лично у меня метод $third->test() вызывает Fatal error: undefined class constant.
Судя по выводу xdebug, интерпретатор успешно доходит до First::init(), но не находит константу First::DIR, несмотря на явно указанное использование LSB.
Что делать? Паника и адъ.
А нужно всего-лишь добавить ключевое слово «static» в определение метода First::init().
Вот такая интересная особенность.
Внимательно читая мануал, можно сделать вывод, что статический вызов методов, не определенных явно, как статические, может вызвать лишь предупреждение уровня E_STRICT.
«Calling non-static methods statically generates an E_STRICT level warning.»
Как оказалось, есть ситуации, когда пользоваться правильными ключевыми словами не только полезно, но и жизненно необходимо.
P.S. Если это мой глюк, связанный с неверным пониманием языка — очень прошу сообщить, я хочу знать в чем ошибаюсь.