Singleton

Особенности:
1) Доступен для любого объекта в системе
2) Не сохраняется в глобальное переменной и поэтому не может быть затёрт
3) Всегда только 1 экземпляр объекта

Реализация:
Создаётся класс который нельзя создать за его пределами. Статический метод не может получить доступ к свойствам объектов, потому что он по определению вызывается через класс, а не в контексте объекта. Но он может получить доступ к статическому свойству. Когда вызывается метод getInstance (), мы проверяем свойство Preferences::$instance. Если оно пусто, то создаем экземпляр класса Preferences и сохраняем его в свойстве. Затем мы возвращаем этот экземпляр вызывающему коду. Поскольку статический метод getInstance () - это часть класса Preferences, у нас нет проблем с созданием экземпляра объекта Preferences, даже несмотря на то что конструктор закрытый.

class Preferences {
    private $props = array();
    private static $instance;
    private function __construct() { }
    public static function getInstance() {
        if ( empty( self::$instance ) ) {
            self::$instance = new Preferences();
        }
        return self::$instance;
    }
    public function setProperty( $key, $val ) {
        $this->props[$key] = $val;
    }
    public function getProperty( $key ) {
        return $this->props[$key];
    }
}

$pref = Preferences::getInstance();
$pref->setProperty( "name", "matt" );
unset( $pref ); // remove the reference
$pref2 = Preferences::getInstance();
print $pref2->getProperty( "name" ) ."\n"; // demonstrate value is not lost