Дисклеймер
Заранее хочу предупредить что это не тема для очередного холивара — я работаю на 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