Как стать автором
Обновить

Возможно, баг в PHP, возможно фича…

Время на прочтение1 мин
Количество просмотров3.1K
… а возможно — баг у меня в уставшей к вечеру голове -))

Пробуйте на 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. Если это мой глюк, связанный с неверным пониманием языка — очень прошу сообщить, я хочу знать в чем ошибаюсь.
Теги:
Хабы:
Всего голосов 15: ↑10 и ↓5+5
Комментарии25

Публикации

Истории

Работа

PHP программист
199 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн