За последние 24 часа нас посетили 22439 программистов и 998 роботов. Сейчас ищут 638 программистов ...

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

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

  1. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Привожу 3 варианта равнозначного по смыслу кода. Интересует Ваше мнение по данному вопросу. Ведь к одиночке мы привыкли
    Вариант 1.
    Код (Text):
    1.  
    2. private static $instance;  
    3. public static function getInstance() {
    4.     if ( !isset(self::$instance) ) {
    5.             self::$instance = new self();
    6.         }
    7.     return self::$instance;
    8. }
    Вариант 2.
    Код (Text):
    1. public static function getInstance() {
    2.     static $instance;
    3.     if ( !isset($instance) ) {
    4.             $instance = new self();
    5.         }
    6.     return $instance;
    7. }
    Вариант 3.
    Код (Text):
    1. public static function getInstance()
    2.     {
    3.             $getInstance = function () use (&$instance) {
    4.                 if (!isset($instance)) {
    5.                     $instance = new self();
    6.                 }
    7.                 return $instance;
    8.             };
    9.         return $getInstance();
    10.     }
    Вариант 3 не рабочий(в смысле объект будет каждый раз возвращаться новый). Может у кого возникнут идеи привести его в рабочий вид
     
  2. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Пичаль но не понял, как работает третий вариант оО

    Добавлено спустя 5 минут 13 секунд:
    Третий вариант ожидаемо возвращает функцию, а не объект класса-одиночки
     
  3. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Поправил замыкание
    $x = Me::getInstance();
    var_dump($x());
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    нескромный вопрос, а что это и к чему?
     
  5. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Она не работает, self в ней уже нет (фатальная ошибка). Если заменить self на имя класса, то каждый раз создаются новые инстанции - не одиночка.
    Писали раньше на сях? =)

    Добавлено спустя 38 секунд:
    Fatal error: Cannot access self:: when no class scope is active
    для точности
     
  6. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Что то я в тупике. К примеру этот код отлично отрабатывает
    Код (Text):
    1. function nextMe($i = 0)
    2. {
    3.     return function ($i = null) use (&$i) {
    4.         return ++$i;
    5.     };
    6. }
    7.  
    8. $revolver = nextMe(); // nextMe(5)
    9. echo $revolver(); // 1   6
    10. echo $revolver(); // 2   7
    11. echo $revolver(); // 3   8
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Сальто с переворотом и головой в заднице
     
  8. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Ведь это красиво
    Код (PHP):
    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.  
    :)
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Да, даже на олимпиаде выступать можно.

    А хотел-то чего?
     
  10. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    а теперь по тестам Вариант 2. не уступает варианту 1.
    С одной лишь разницей объявленной переменной private static $instance;
    Почему не распространен вариант №2
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Singleton - шаблон
    Poznakomlus, ни один вариант у тебя не рабочий.
    первая ошибка вместо isset использовать empty - чтобы не затереть объект который существует
    вторая ошибка вместо new self() использовать имя самого класса
    Код (Text):
    1. self::$instance = new Singleton();
    второй вариант я вообще не знаю что такое.

    Добавлено спустя 5 минут 5 секунд:
    как ты их хоть протестировал?
     
  13. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    а !isset че не прокатывет, (затереть объект о чем здесь). Ребята ссори перебрал, если можно снесите тему
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ты просто скажи какая задача была
     
  15. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    задачи как таковой не было возникло мнение что использование
    static внутри функции как то приличнее чем внутри класса.
    Код (Text):
    1.  
    2. class A
    3. {
    4.     public static function getInstance()
    5.     {
    6.         static $instance;
    7.         if (!isset($instance)) {
    8.             $instance = new self();
    9.         }
    10.  
    11.         return $instance;
    12.     }
    13.  
    14.     public function test()
    15.     {
    16.         return 'Yes';
    17.     }
    18. }
    19.  
    20. $Foo = A::getInstance();
    21. var_dump($Foo->test());
    я про static $instance;
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    это плохой признак. =)
     
  17. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    примерами подтвердить можешь?
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    да. ты - пример. =) но у тебя ещё есть шанс одуматься.
     
  19. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    да, это доки , мы знаем)
    но это не о том о чем ты писал вначале
     
  20. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    А о чем я писал в начале (это же надо было столько дернуть) и о том чтоб состояние хранить внутри функции с помощью stаtic или замыканий
     
  21. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    непонятно о чем ты сейчас пишешь. А тема у тебя назыается
    а одиночка это Singleton.
     
  22. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    а одиночка это Singleton.[/quote] Singleton
    А может static ? а еще и замыкание?
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Так ты хотел синглтон сделать или всё же велосипедишь?
     
  24. Poznakomlus

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

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    По количеству сообщений и по качеству ответов похоже на форумного бота.
    Singleton один из шаблонов проектирования. Вот жирным тебе и отметил. Шаблон это не канон и не аксиома. Реализация остается на выбор разработчику.
     
  25. igordata

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

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

    ну так ты хотел его сделать? Просто первые сообщения реально похожи на бред сумасшедшего. остальные немного тоже.