Верх страницы
Обложка к записи PHP Singleton (Одиночка)
Время для прочтения: 1 мин. 3 сек.

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

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

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

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() не выполнялась проверка.

Визуально

Одиночка. Singleton ► Шаблон проектирования ► Урок №9Одиночка. Singleton ► Шаблон проектирования ► Урок №9

Удачного вам кодинга!

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

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, Opencart, DLE, Laravel, Moonshine, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

3 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Константин
Константин
1 год назад

Хочу купить php singleton пример

Инна
Инна
1 год назад

Где узнать про

Предыдущая запись
Следующая запись

Давайте дружить
в Телеграме

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы