Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Pattern Singleton 
:(
    Опции темы
 
Какой способ вы используете
Первый [ 3 ]  [37.50%]
Второй [ 1 ]  [12.50%]
Третий [ 1 ]  [12.50%]
Свой, укажу в комментарии [ 1 ]  [12.50%]
Не использую [ 2 ]  [25.00%]
Всего проголосовавших: 8
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
MoLeX
Дата 9.2.2011, 12:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Добрый день.

Есть несколько способов создание Singletonа

1. Singleton
Код

class Singleton {

  protected static $instance;

  private function __construct() {}
  private function __clone() {}

  public static function getInstance() {
    return (self::$instance === null) ?
        self::$instance = new self() :
        self::$instance;
  }

  public function doAction() {}
}


2. Singleton
Код

abstract class Singleton {
  private static $instances;

  final protected function __construct() {
  }

  final private function __clone() {
  }

  final public static function getInstance() {
    $class = get_called_class();
    if (!isset(self::$instances[$class])) {
      self::$instances[$class] = new $class;
    }
    return self::$instances[$class];
  }
}



Но помимо тех способах, есть еще:
3. Singleton
Код

function app( $class = null )
{
    static $obj = array();
            
    if( ! isset($obj[$class]) )
        $obj[$class] = new $class();
        
    return $obj[$class];




Кто какой использует и почему?

Добавлено через 39 секунд
P.S. Навеяно обсуждением на хабре


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Shogun
Дата 9.2.2011, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Второй, намного удобнее, но есть и нюансы.


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
ksnk
Дата 9.2.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



У меня почему-то получается третий. Он как-то ближе к PHP. Не в каждом языке можно писать скрытые глобальные переменные  smile Первые два - тяжелое наследие java. 
К тому-же по эффективности третий способ проигрывает только явным глобальным переменным. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Muerto
Дата 9.2.2011, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



Из тех вариантов что выше 2ой предпочитаю...


Это сообщение отредактировал(а) Muerto - 9.2.2011, 19:06


--------------------
user posted image
PM MAIL   Вверх
Dima 2015
Дата 9.2.2011, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: 2
Всего: 2



Очень интересная тема. Сразу скажу, я не очень силен в ООП, но синглетон  как раз пытаюсь использовать. Судя по предложенному коду я использую 1й. И у меня возник вопрос как вообще применяются 2 и 3 способы? 
Способ 2 - это класс, который должен реализовывать синглетон наследуется от класса Singleton? А как быть если нужный класс должен быть унаследован еще от чего-нибудь, например от абстрактного юзера. Ведь в пхп нет множественного наследования...

Способ 3 - это что-то типа фабрик для объектов класса? Но тогда, раз мы можем написать $obj[$class] = new $class(); - то какой же это к черту синглетон. Если можно написать new $class - значит у него конструктор открыт..?

Проясните если несложно для начинающего разбираться в ООП smile

Это сообщение отредактировал(а) Dima 2015 - 9.2.2011, 19:13
PM MAIL ICQ   Вверх
Shogun
Дата 9.2.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Цитата(Dima 2015 @  9.2.2011,  19:10 Найти цитируемый пост)
Способ 2 - это класс, который должен реализовывать синглетон наследуется от класса Singleton?
 - ага

Цитата(Dima 2015 @  9.2.2011,  19:10 Найти цитируемый пост)
А как быть если нужный класс должен быть унаследован еще от чего-нибудь, например от абстрактного юзера.
Ну собственно это и есть тот минус такого метода, как решение сделать чтобы абстрактный класс юзера наследовался от синглетона, но это уже может привлечь другие проблемы или ограничения.

Цитата(Dima 2015 @  9.2.2011,  19:10 Найти цитируемый пост)
Способ 3 - это что-то типа фабрик для объектов класса? Но тогда, раз мы можем написать $obj[$class] = new $class(); - то какой же это к черту синглетон. Если можно написать new $class - значит у него конструктор открыт..?

Этот способ что-то вроде гибрида между factory и registry и в стиле пхп4 =))

Код
 if( ! isset($obj[$class]) ) $obj[$class] = new $class(); 
 - тут проверка для синглетона. 

Это сообщение отредактировал(а) Shogun - 9.2.2011, 21:30


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
Dima 2015
Дата 10.2.2011, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: 2
Всего: 2



Shogun, понял спасибо. Все как я и думал.
PM MAIL ICQ   Вверх
MoLeX
Дата 10.2.2011, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



ksnk, тоже использую третий. 
1 и 2 не понравились результатами теста, к ф-ции доступ всегда быстрее. Причем для второго способа надо PHP >= 5.3, из-за
Код

get_called_class();



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
SneG0K
Дата 10.2.2011, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



Первый, иногда нужен конструктор

Добавлено через 1 минуту и 9 секунд
И второй работает только по-моему начиная с 5.3
PM WWW Skype   Вверх
Dima 2015
Дата 11.2.2011, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: 2
Всего: 2



MoLeX
Цитата

к ф-ции доступ всегда быстрее

неужели это может быть ощутимо? Ну в плане нагрузки на сервер в посещаемом проекте..
PM MAIL ICQ   Вверх
MoLeX
Дата 11.2.2011, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



может)


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Shogun
Дата 11.2.2011, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Код

<?php

####################################
# 0.2836 - 0.3044
class App 
  {
    private static $instance;
    
    public static function instance()
      {
        return (!(self::$instance instanceof self) ? self::$instance = new self : self::$instance);
      }
      
    protected function __construct() {}
    final protected function __clone() {}
  }


####################################
# 0.5385 - 0.5548
abstract class Singleton
  {
    private static $instances = array();  
    
    final public static function instance()
      {
        $class = get_called_class();  
        
        return (!self::$instances[$class] ? self::$instances[$class] = new $class : self::$instances[$class]);
      }
  
    protected function __construct() {}
    final protected function __clone() {}
  }

class App extends Singleton {  }


####################################
# 0.2740 - 0.2941
function instance($class)
  {
    static $instances = array();
    
    return (!$instances[$class] ? $instances[$class] = new $class : $instances[$class]);
  }

class App 
  {
    public function __construct(){}
    final protected function __clone(){}
  }


####################################
# 0.2470 - 0.2615
function App()
  {
    static $instance;
    
    return (!$instance ? $instance = new App : $instance);
  }

class App 
  {
    public function __construct(){}
    final protected function __clone(){}
  }



####################################
$start = microtime(true);

for ($i=0; $i<10000; $i++)
  {
    #$app = App::instance();
    #$app = instance('App');
    #$app = App();
  }

$end = microtime(true);

$time = $end - $start;

echo '<br/><br/>Time: ', $time;


вроде так...

Цитата(Dima 2015 @  11.2.2011,  02:24 Найти цитируемый пост)
неужели это может быть ощутимо? Ну в плане нагрузки на сервер в посещаемом проекте.. 
 - сомневаюсь...



--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
Dima 2015
Дата 11.2.2011, 16:37 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: 2
Всего: 2



MoLeX, сталкивался? Просто сразу тут возникает вопрос что за проект, как написан, какая посещаемость, какие сервера... а то все эти разговоры в пользу бедных. Я с трудом вообще представляю проект где сами пыхофункции будут тормозить...

Ну т.е. время работы самого пхп относительно времени получения данных с диска и вывода этих данных в браузер, оно обычно раз в 10 меньше. Т.е. у нас 0,001 сек выполняется пхп и 0,01 сек получаются данные из БД и выводятся в браузер (echo может быть долгим, ага). Так вот, ну выйграем мы 0.0005 сек за счет использования ф-ций вместо классов, вот радость то...

Это сообщение отредактировал(а) Dima 2015 - 11.2.2011, 16:39
PM MAIL ICQ   Вверх
MoLeX
Дата 14.2.2011, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Dima 2015, все зависит от самого приложения. У нас очень много классов, при чем есть очень прожорливые классы. По тестам для нас выгодно использовать ф-цию, что мы и делаем


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.