Ок поехали. Ваше утверждение класс A лучше. Я говорю класс B. Код (Text): class A{ private static $instance; function getInstance(){} } class B{ function getInstance(){ static $instance; } } Мои доводы $instance закрыта от других методов класса Ваши доводы Есть что добавить?
Хранение экземпляра в статичной переменной соответствует паттерну. Так или иначе, это статическая переменная, в классе или методе. А вот реализация с фукцией позволяет получить несколько экземпляров, по экземпляру на каждую копию функции. Надо отметить, что пока открыты методы конструктора и клонирования, реализация не соответствует паттерну.
А вот тут подробнее. Я доводы привел. Про отмеченное (защиту, магию ...) здесь указано как изменить по ссылке приватные переменные класса http://habrahabr.ru/post/186718 Да у меня не получилось реализовать этот патерн через замыкания. Признаю
да, но как только ты меняешь шаблон по своему усмотрению, это уже не шаблон одиночка, это уже статик это статик, замыкание это замыкание, singleton это singleton/ тебе нужно было что-то другое, ты начал с singleton но потом переключился на примеры из документации, и начал про статики писать. Так тебе что нужно сделать? Твои методы не справляются с возлагаемой на них обязанностями, а что нужно ты не говоришь. Добавлено спустя 3 минуты 3 секунды: ты скажи, какая перед тобой стоит задача - может кто подкинет толковое.
Шаблон singleton через замыкания Код (Text): function getValute($name) { return function ($name) use (&$xml) { if (!isset($xml)) { $file = 'http://pfsoft.com.ua/service/currency/?date=' . date('dmY'); $xml = simplexml_load_file($file); } $valute = $xml->xpath("/ValCurs/Valute[CharCode='$name']")[0]; return $valute->Nominal . ' ' . $valute->Name . ' - ' . $valute->Value; }; } $valute = getValute($name); echo $valute('USD'), '<br>', $valute('EUR'); где здесь документация или в классике revolver? Эти примеры работают сохраняют свой значения и не происходит лишнего вызова simplexml_load_file
Доступ к приватным свойствам не дает возможность создать два экземпляра правильно singeton Код (Text): class S { private function __construct(); private function __clone(); private function __wakeup(); Без этого у тебя не Singleton, а класс с функцией, которая возвращает один и тот же экземпляр. К какой мысли нужны аргументы - я не понял. Добавлено спустя 4 минуты 24 секунды: Не получится. Функция-замыкание $valute() может хранить экземпляр класса. Но ничего не мешает создать перемнную $valute2() и из неё получить другой экземпляр.
Фух! Наконец-то пошли какие-то здравые разговоры. согласен, что снаружи пофик, что так что эдак. Но внутри? Чего ты добился этим? =) В случае, если ты хочешь вызывать методы снаружи через ссылку на экземпляр, то всё в порядке. В случае, если есть некие внутренние механики, которым требуется обращаться к методам экземпляра этого класса, то уже не получится. Если таковых нет, и единственная задача вернуть ссылку, то оба варианта наверное снаружи эквивалентны. Если конечно в классе B метод тоже статический. Если нет, то он будет плодить экземпляры.