Синглтон на php
дата публикации: 2016-02-22

В статье про реализацию паттерна фабричный метод я упоминал про синглтон или паттерн одиночка. В чем же суть этого паттерна. Представьте себе проект, в котором вы активно пользуетесь базой данных. Написали вы класс работы с ней, предоставили интерфейс другому человеку, а он взял да и стал создавать по 10 подключений к базе данных в каждом файле. В общем то все работает и ладно считает он. Но мы то знаем, что это не оптимально, однако тут не правы в первую очередь мы, так как дали техническую возможность совершать ошибки.

Таких примеров очень много. То есть речь о задачах, в которых какой либо экземпляр класса должен существовать в единичном виде. Вот допустим мы создали два класса, один работает с планетами, а другой со звездами, но при этом мы ведем расчеты в пределах солнечной системы, соответственно логично было бы реализовать синглтон применимо с классу звезд (Солнце у нас одно). Давайте ближе к коду. Так как чаще приходится видеть примеры с базой данных, то приведу пример с единственной звездой в солнечной системе.

//classes.php 
class starSun {
  //переменная, которая хранит объект
  protected static $obj;
  //делаем приватными все функции создания экземпляра
  private function __construct() {}
private function __clone() {} private function __wakeup() {}
//создаем точку входа доступную без создания экземпляра public static function getObject() {
if (self::$obj == null) { self::$obj = new self; } return self::$obj; }
public function getInfo() { print 'Hello, I am Singlton'; }
} //index.php include 'classes.php'; $obj = starSun::getObject(); $obj->getInfo();

Суть синглтона в том, чтобы заменить стандартную точку входа в класс, конструктор или клонирование и прочее на функцию, доступную без создания экземпляра, но, которая создает экземпляр (если он еще не создан) внутри себя и возвращает ссылку на него. Таким образом, сколько бы раз мы не вызывали функцию getObject() экземпляр класса будет создан только один раз, все последующие обращения будут возвращать ссылку на уже созданный экземпляр. Как уже было сказано выше, на практике это применимо в случае работы с объектами заведомо единичными.