Шаблоны проектирования в 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)
Добавить комментарий