PHP Singleton (Одиночка)
Singleton Pattern
(single — единственный [англ.] ton — мода, стиль [англ.]) — один из наиболее известных шаблонов проектирования.
Суть паттерна
Одиночка — это порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
Почти в любой объктно-ориентированной программе обычно существует один-два объекта, которые инициализируются в начале, и используются на всем протяжении работы приложения (доступ к базе данных, система сбора логов, разнообразные конфигураторы, блокировка файла в приложении).
Нет нужды каждый раз создавать объект класса, достаточно создать один экземпляр класса, в начале работы программы, и пользоваться им.
PHP 5.0
В РНР5 singleton определяется так:
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() {}
}
// Пример использования
Singleton::getInstance()->doAction();
Преимущества данного метода очевидны:
- Мы используем ссылки на один и тот же экземпляр класса в разных частях проекта. Таким образом не нужно создавать новый объект каждый раз когда мы хотим воспользоваться каким-то методом — просто пользуемся ссылкой.
- Теперь не нужно передавать объект как аргумент, чтоб все части программы были «в курсе» о текущем состоянии объекта. Все ссылки указывают на один объект.
PHP 5.3
Начиная с PHP 5.3.0 была добавлена возможность Late Static Bindings, благодаря которой этот паттерн можно реализовать в виде абстрактного класса:
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]
PHP 5.4
Начиная с PHP 5.4 был добавлен новый механизм обеспечения повторного использования кода при помощи трейтов:
<?php
trait Singleton {
private static $instance = null;
private function __construct() { /* ... @return Singleton */ }
private function __clone() { /* ... @return Singleton */ }
private function __wakeup() { /* ... @return Singleton */ }
public static function getInstance() {
return
self::$instance===null
? self::$instance = new static()
: self::$instance;
}
}
/**
* Class Foo
* @method static Foo getInstance()
*/
class Foo {
use Singleton;
private $bar = 0;
public function incBar() {
$this->bar++;
}
public function getBar() {
return $this->bar;
}
}
/*
Применение
*/
$foo = Foo::getInstance();
$foo->incBar();
var_dump($foo->getBar());
$foo = Foo::getInstance();
$foo->incBar();
var_dump($foo->getBar());
PHP 8
Все магические методы, за исключением __construct()
, __destruct()
и __clone()
, ДОЛЖНЫ быть объявлены как public
, в противном случае будет вызвана ошибка уровня E_WARNING.
До PHP 8.0.0 для магических методов __sleep()
, __wakeup()
, __serialize()
, __unserialize()
и __set_state()
не выполнялась проверка.
Визуально
Удачного вам кодинга!
Хочу купить php singleton пример
Пример выше в статье
Где узнать про