Чудно́е в 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) № 1
Интересно, что и HHVM (3.1) ведёт себя так же. «Эмулируют» ПХП-шные баги для совместимости.
Алек № 2
Занятно. Есть такой же баг про трейты: https://bugs.php.net/bug.php?id=67114
Евгений Степанищев (bolknote.ru) автор № 3

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

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.