Шаблоны проектирования в PHP: Singleton
Singleton (Синглтон, одиночка) - порождающий шаблон проектирования, гарантирует, что в приложении(однопоточном) будет использоваться только один(единственный) экземпляр класса. Объекты класса Singleton будут созданы только один раз и при последующих обращениях будет использоваться уже созданный объект, а не будут создаваться новые экземпляры. Это очень удобно и экономно. Например: соединение к БД - нам не нужно каждый раз создавать новое соединение; доступ к объекту конфигурации; в MVC - порождение главного контроллера; объект логирования.
Пример Singletone на PHP
<?php class Singleton { private static $instance = null; public static function getInstance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } protected function __construct() { } private function __clone() { } private function __wakeup() { } } class SingletonChild extends Singleton { } $obj = Singleton::getInstance(); var_dump($obj === Singleton::getInstance()); // bool(true) $anotherObj = SingletonChild::getInstance(); var_dump($anotherObj === Singleton::getInstance()); // bool(false) var_dump($anotherObj === SingletonChild::getInstance()); // bool(true)
Код выше реализует паттерн проектирования Singleton с использованием статической переменной, в которой храниться объект и метода getInstance для его создания. Обратите внимание:
1. конструктор __construct объявлен как protected, чтобы предотвратить создание нового объекта вне класса с помощью оператора new.
2. магический метод __clone объявлен как private, чтобы предотвратить клонирование объекта с помощью оператора clone.
3. магический метод __wakeup объявлен как private, чтобы предотвратить десериализацию объекта через глобальную функции unserialize().
Синглтон можно реализовать с помощью с помощью позднего статического связывания (Начиная с версии PHP 5.3.0).
<?php class Singleton { public static function getInstance() { static $instance = null; if (null === $instance) { $instance = new static(); } return $instance; } protected function __construct() { } private function __clone() { } private function __wakeup() { } } class SingletonChild extends Singleton { } $obj = Singleton::getInstance(); var_dump($obj === Singleton::getInstance()); // bool(true) $anotherObj = SingletonChild::getInstance(); var_dump($anotherObj === Singleton::getInstance()); // bool(false) var_dump($anotherObj === SingletonChild::getInstance()); // bool(true)
Добавить комментарий