Особенности:
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