Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Чудно́е в PHP

На работе сейчас с любопытным багом в ПХП разбирались. Разобрались, вот выжимка:

interface I {}

var_dump(class_exists('cI')); // false
var_dump(class_exists('C')); // true

class cI implements I {}
class C {}

var_dump(class_exists('cI')); // true
var_dump(class_exists('C')); // true

Выходит, если класс реализует интерфейс, то его не существует выше строки, где он декларируется, класс без реализации интерфейса виден в любом месте. Версия ПХП — 5.5.11. Я для интереса попробовал на 5.6а1 (есть под рукой собранный) — работает так же.

4 комментария
Сергей Морозов (morozov.livejournal.com) 2014

Интересно, что и HHVM (3.1) ведёт себя так же. «Эмулируют» ПХП-шные баги для совместимости.

Алек 2014

Занятно. Есть такой же баг про трейты: https://bugs.php.net/bug.php?id=67114

Евгений Степанищев (bolknote.ru) 2014

Комментарий для Алек:

И там же есть ответ:

This is a nifty case: Only «simple» classes are fully available after compile time, classes with «complexer» things (interface,traits, ...) will be bound and made available at runtime in the place where they are declared.

PHP 2014

Вся правда о ПЫХе:

lurkmore.to/PHP