Pull to refresh

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

Reading time1 min
Views3.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. Если это мой глюк, связанный с неверным пониманием языка — очень прошу сообщить, я хочу знать в чем ошибаюсь.
Tags:
Hubs:
Total votes 15: ↑10 and ↓5+5
Comments25

Articles