PHP singleton

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();
?>

Преимущества данного метода очевидны:

  1. Мы используем ссылки на один и тот же экземпляр класса в разных частях проекта. Таким образом не нужно создавать новый объект каждый раз когда мы хотим воспользоваться каким-то методом — просто пользуемся ссылкой.
  2. Теперь не нужно передавать объект как аргумент, чтоб все части программы были «в курсе» о текущем состоянии объекта. Все ссылки указывают на один объект.

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/

Михаил Кобзарёв

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: