Pull to refresh

Почему я не люблю PHP

Reading time1 min
Views971

Дисклеймер


Заранее хочу предупредить что это не тема для очередного холивара — я работаю на 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
Tags:
Hubs:
+7
Comments40

Articles