За последние 24 часа нас посетили 17883 программиста и 1716 роботов. Сейчас ищут 906 программистов ...

Одиночка а нужна ли?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Poznakomlus, 8 ноя 2014.

  1. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Ок поехали. Ваше утверждение класс A лучше. Я говорю класс B.
    Код (Text):
    1. class A{
    2.     private static $instance;
    3.     function getInstance(){}
    4. }
    5.  
    6. class B{
    7.     function getInstance(){
    8.         static $instance;
    9.     }
    10. }
    Мои доводы $instance закрыта от других методов класса
    Ваши доводы
    Есть что добавить?
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Хранение экземпляра в статичной переменной соответствует паттерну. Так или иначе, это статическая переменная, в классе или методе. А вот реализация с фукцией позволяет получить несколько экземпляров, по экземпляру на каждую копию функции.
    Надо отметить, что пока открыты методы конструктора и клонирования, реализация не соответствует паттерну.
     
  3. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    А вот тут подробнее. Я доводы привел.
    Про отмеченное (защиту, магию ...) здесь указано как изменить по ссылке
    приватные переменные класса http://habrahabr.ru/post/186718
    Да у меня не получилось реализовать этот патерн через замыкания. Признаю
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    да, но как только ты меняешь шаблон по своему усмотрению, это уже не шаблон одиночка, это уже
    статик это статик, замыкание это замыкание, singleton это singleton/
    тебе нужно было что-то другое, ты начал с singleton но потом переключился на примеры из документации, и начал про статики писать.
    Так тебе что нужно сделать? Твои методы не справляются с возлагаемой на них обязанностями, а что нужно ты не говоришь.

    Добавлено спустя 3 минуты 3 секунды:
    ты скажи, какая перед тобой стоит задача - может кто подкинет толковое.
     
  5. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Шаблон singleton через замыкания
    Код (Text):
    1.     function getValute($name)
    2.     {
    3.         return function ($name) use (&$xml) {
    4.             if (!isset($xml)) {
    5.                 $file = 'http://pfsoft.com.ua/service/currency/?date=' . date('dmY');
    6.                 $xml = simplexml_load_file($file);
    7.             }
    8.             $valute = $xml->xpath("/ValCurs/Valute[CharCode='$name']")[0];
    9.             return $valute->Nominal . ' ' . $valute->Name . ' - ' . $valute->Value;
    10.         };
    11.     }
    12.      
    13.     $valute = getValute($name);
    14.     echo $valute('USD'), '<br>', $valute('EUR');
    15.      
    где здесь документация или в классике revolver? Эти примеры работают сохраняют свой значения и не происходит лишнего вызова simplexml_load_file
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Доступ к приватным свойствам не дает возможность создать два экземпляра правильно singeton

    Код (Text):
    1. class S
    2. {
    3. private function __construct();
    4. private function __clone();
    5. private function __wakeup();
    Без этого у тебя не Singleton, а класс с функцией, которая возвращает один и тот же экземпляр.

    К какой мысли нужны аргументы - я не понял.

    Добавлено спустя 4 минуты 24 секунды:
    Не получится.
    Функция-замыкание $valute() может хранить экземпляр класса. Но ничего не мешает создать перемнную $valute2() и из неё получить другой экземпляр.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Фух! Наконец-то пошли какие-то здравые разговоры.

    согласен, что снаружи пофик, что так что эдак.
    Но внутри? Чего ты добился этим? =) В случае, если ты хочешь вызывать методы снаружи через ссылку на экземпляр, то всё в порядке. В случае, если есть некие внутренние механики, которым требуется обращаться к методам экземпляра этого класса, то уже не получится.

    Если таковых нет, и единственная задача вернуть ссылку, то оба варианта наверное снаружи эквивалентны. Если конечно в классе B метод тоже статический. Если нет, то он будет плодить экземпляры.
     
  8. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Всем спасибо за диалог
    :)
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768