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/