singleton_eyecatch
Время для прочтения: 1 мин. 14 сек.

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]


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

Для вставки кода используйте HTML-теги
<pre><code class="php">ваш код</code></pre>

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

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.