Дисклеймер
Заранее хочу предупредить что это не тема для очередного холивара — я работаю на PHP уже довольно давно и довольно успешно. Но все это только потому что этот язык очень распространен да и наверное по привычке ;) Но очень часто бывают моменты в моей практике когда понимаешь, что язык этот далеко не совершенен.
Так что ждем с нетерпением PHP6 :)
Между тем, не судите строго и не спешите минусовать мне карму — это мой первый хабратопик
Собственно проблема
Задача стояла довольно обыкновенная — нужно было использовать паттерн Singleton
для некоторого количества классов. Ясное дело что делать это для каждого класса отдельно нет резона, да и зачем если есть наследование!
Пара минут и — вуаля — все гениальное просто:
class static_base { static $instance = null; static function instance() { if (! self::$instance) self::$instance = new self(); return self::$instance; } }; class static_A extends static_base {}; class static_B extends static_base {}; static_A::instance(); static_B::instance();
Но вот не тут то было! Я и забыл что это PHP5.2.4. Как вы думаете — каков результат работы этого кода? Низачто не угадаете — оба вызова возвращают один и тот же объект, причем класса
static_base
!Вот так и верь после этого людям
Как оказалось модификатор
self
подставляется в PHP на этапе парсинга кода, так что нет никакой разницы в вызове static_A::instance()
и static_base::instance()
.Хорошо что это исправили в PHP5.3 введением модификатора
static
наряду с self