Привожу 3 варианта равнозначного по смыслу кода. Интересует Ваше мнение по данному вопросу. Ведь к одиночке мы привыкли Вариант 1. Код (Text): private static $instance; public static function getInstance() { if ( !isset(self::$instance) ) { self::$instance = new self(); } return self::$instance; } Вариант 2. Код (Text): public static function getInstance() { static $instance; if ( !isset($instance) ) { $instance = new self(); } return $instance; } Вариант 3. Код (Text): public static function getInstance() { $getInstance = function () use (&$instance) { if (!isset($instance)) { $instance = new self(); } return $instance; }; return $getInstance(); } Вариант 3 не рабочий(в смысле объект будет каждый раз возвращаться новый). Может у кого возникнут идеи привести его в рабочий вид
Пичаль но не понял, как работает третий вариант оО Добавлено спустя 5 минут 13 секунд: Третий вариант ожидаемо возвращает функцию, а не объект класса-одиночки
Она не работает, self в ней уже нет (фатальная ошибка). Если заменить self на имя класса, то каждый раз создаются новые инстанции - не одиночка. Писали раньше на сях? =) Добавлено спустя 38 секунд: Fatal error: Cannot access self:: when no class scope is active для точности
Что то я в тупике. К примеру этот код отлично отрабатывает Код (Text): function nextMe($i = 0) { return function ($i = null) use (&$i) { return ++$i; }; } $revolver = nextMe(); // nextMe(5) echo $revolver(); // 1 6 echo $revolver(); // 2 7 echo $revolver(); // 3 8
Ведь это красиво Код (PHP): 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');
а теперь по тестам Вариант 2. не уступает варианту 1. С одной лишь разницей объявленной переменной private static $instance; Почему не распространен вариант №2
Singleton - шаблон Poznakomlus, ни один вариант у тебя не рабочий. первая ошибка вместо isset использовать empty - чтобы не затереть объект который существует вторая ошибка вместо new self() использовать имя самого класса Код (Text): self::$instance = new Singleton(); второй вариант я вообще не знаю что такое. Добавлено спустя 5 минут 5 секунд: как ты их хоть протестировал?
а !isset че не прокатывет, (затереть объект о чем здесь). Ребята ссори перебрал, если можно снесите тему
задачи как таковой не было возникло мнение что использование static внутри функции как то приличнее чем внутри класса. Код (Text): class A { public static function getInstance() { static $instance; if (!isset($instance)) { $instance = new self(); } return $instance; } public function test() { return 'Yes'; } } $Foo = A::getInstance(); var_dump($Foo->test()); я про static $instance;
А о чем я писал в начале (это же надо было столько дернуть) и о том чтоб состояние хранить внутри функции с помощью stаtic или замыканий
По количеству сообщений и по качеству ответов похоже на форумного бота. Singleton один из шаблонов проектирования. Вот жирным тебе и отметил. Шаблон это не канон и не аксиома. Реализация остается на выбор разработчику.
так и есть ну так ты хотел его сделать? Просто первые сообщения реально похожи на бред сумасшедшего. остальные немного тоже.