Singleton Pattern
(single — единственный [англ.] ton — мода, стиль [англ.]) — один из наиболее известных шаблонов проектирования. Почти в любой объктно-ориентированной программе обычно существует один-два объекта, которые инициализируются в начале, и используются на всем протяжении работы приложения. Нет нужды каждый раз создавать объект класса, достаточно создать один экземпляр класса, в начале работы программы, и пользоваться им.
В РНР5 singleton определяется так
<? php class Singleton { private static $instance; /** * Защищаем от создания через new Singleton * @return Singleton */ private function __construct() {} /** * Защищаем от создания через клонирование * @return Singleton */ private function __clone() {} /** * Защищаем от создания через unserialize * @return Singleton */ private function __wakeup() {} /** * Возвращает единственный экземпляр класса * @return Singleton */ public static function getInstance() { if (self::$instance === null) { self::$instance = new self; } return self::$instance; } /** * Делаем что-нибудь */ public function doAction() {} } ?>
Пример использования
<? php Singleton::getInstance()->doAction(); ?>
Преимущества данного метода очевидны:
- Мы используем ссылки на один и тот же экземпляр класса в разных частях проекта. Таким образом не нужно создавать новый объект каждый раз когда мы хотим воспользоваться каким-то методом — просто пользуемся ссылкой.
- Теперь не нужно передавать объект как аргумент, чтоб все части программы были «в курсе» о текущем состоянии объекта. Все ссылки указывают на один объект.
PHP 5.3
Начиная с PHP 5.3.0 была добавлена возможность Late Static Bindings, благодаря которой этот паттерн можно реализовать в виде абстрактного класса:
<? php abstract class Singleton { /** * @return Singleton */ final public static function getInstance() { static $instance = null; if (null === $instance) { $instance = new static(); } return $instance; } final protected function __clone() {} protected function __construct() {} } class Foo extends Singleton { } class Bar extends Singleton { } var_dump(Foo::getInstance()); // object(Foo)[1] var_dump(Bar::getInstance()); // object(Bar)[2]
Удачного вам кодинга!
Источник: https://www.kobzarev.com/programming/php-singleton/