Профессиональное программирование на PHP

Страница 65 из 591


68 Глава 2 Объектно-ориентированное программирование...

^ return self::$instance;

$a = Singleton::getlnstance(); $b = Singleton::getlnstanceО; $a->property = "hello world"; print $b->property;

Выполнение данного кода приводит к выводу строки "hello world", чего и следовало ожидать от синглтона. Необходимо отметить, что метод-конструктор объявляется как private. Это не опечатка. Если конструктор объявлен как частный метод, то создать экземпляр с помощью конструкции new Singleton можно только внутри области видимости класса. Если попытаться создать объект за пределами класса, то возникнет неисправимая ошибка.

Некоторые разработчики патологически враждебно относятся к factory-методам.

Чтобы удовлетворить их симпатии, можно также использовать операторы_get () и

_set () для создания синглтона посредством конструктора:

class Singleton {

private static $props = array();

public function _construct() {}

public function _get($name)

if(array_key_exists($name, self::$props)) { return self::$props[$name];

} 1

public function _set($name, $value)

^ self::$props[$name] = $value;

$a = new Singleton; $b = new Singleton; $a->property = "hello world"; print $b->property;

В данном примере все значения свойств класса хранятся в статическом массиве. Когда к свойству осуществляется доступ для чтения или записи, обработчики* доступа

—9et и_set используют статический массив класса вместо внутренней таблицы

свойств объекта.

Автор предпочитает использовать factory-методы. Синглтоны сравнительно редко встречаются в приложениях, и необходимость их создания специальным способом (через factory-метод) усиливается тем, что они различны. Кроме того, с помощью частного конструктора можно предотвратить неконтролируемое создание новых членов класса.

В главе 6, "Блочное тестирование" factory-метод используется для создания псевдо-синглтона, где класс имеет только один глобальный экземпляр для уникального параметра.




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006