powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Какую имплементацию синглтона выбираете вы?
19 сообщений из 19, страница 1 из 1
Какую имплементацию синглтона выбираете вы?
    #37733533
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... и почему?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
<?php
switch ($argv[1]) {
    case 'a':
        class Singleton {
            public function getInstance() {
                static $instance;
                return $instance ?: $instance = new static;
            }

            protected function __construct() {}
            protected function __clone() {}
        }

        class a extends Singleton {}
        class b extends Singleton {}
        class c extends a {}
        break;
    case 'b':
        class Singleton {
            private static $instances = array();

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

            protected function __construct() {}
            protected function __clone() {}
        }

        class a extends Singleton {}
        class b extends Singleton {}
        class c extends a {}
        break;
    case 'c':
        class a {
            private static $instance;

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

        class b {
            private static $instance;

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

        class c extends a {
            private static $instance;

            public function getInstance() {
                return self::$instance ?: self::$instance = new self;
            }
        }
        break;
    case 'd':
        class Singleton {
            public function getInstance() {
                return static::$instance ?: static::$instance = new static;
            }
        }

        class a extends Singleton {
            protected static $instance;
        }

        class b extends Singleton {
            protected static $instance;
        }

        class c extends a {
            protected static $instance;
        }
        break;
}

var_dump(a::getInstance() === a::getInstance());
var_dump(b::getInstance() === b::getInstance());
var_dump(c::getInstance() === c::getInstance());
var_dump(get_class(a::getInstance()) == 'a');
var_dump(get_class(b::getInstance()) == 'b');
var_dump(get_class(c::getInstance()) == 'c');

$start_uts = microtime(true);
for ($i = 0; $i < $argv[2]; ++$i)
    a::getInstance();
echo microtime(true) - $start_uts, "\n";

$start_uts = microtime(true);
for ($i = 0; $i < $argv[2]; ++$i)
    b::getInstance();
echo microtime(true) - $start_uts, "\n";

$start_uts = microtime(true);
for ($i = 0; $i < $argv[2]; ++$i)
    c::getInstance();
echo microtime(true) - $start_uts, "\n";

$start_uts = microtime(true);
for ($i = 0; $i < $argv[2]; ++$i) {
    a::getInstance();
    b::getInstance();
    c::getInstance();
}
echo microtime(true) - $start_uts, "\n";

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
an0nym@MacBook-Air-an0nym.local ~ $ php test.php a 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
1.349072933197
1.3529658317566
1.3770401477814
3.5435800552368
an0nym@MacBook-Air-an0nym.local ~ $ php test.php b 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
1.8438360691071
1.774337053299
1.7799360752106
4.8197588920593
an0nym@MacBook-Air-an0nym.local ~ $ php test.php c 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
1.3446218967438
1.3232281208038
1.3223729133606
3.5394291877747
an0nym@MacBook-Air-an0nym.local ~ $ php test.php d 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
1.5106999874115
1.5163450241089
1.5146861076355
4.0018219947815
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733535
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

Это типа опроса?
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733549
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как инстансы получать?
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733551
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы предпочел вариант A (хотя раньше делал вариант C), мне они кажутся более простыми и логичными.
Вопрос в том, как заставить редакторы понимать инстанс правильно?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<?php

abstract class Singleton {

    /** @return чо? */
    public static function getInstance()
    {
        static $instance;
        return $instance ?: new static;
    }

    protected function __construct(){}
    protected function __clone(){}
}

class B extends Singleton {

    protected $_data;

    public function set($key, $value)
    {
        $this->_data[$key] = $value;
    }
    public function get($key)
    {
        return isset($this->_data[$key]) ? $this->_data[$key] : null;
    }
}

$b = B::getInstance();

//Тот же PHPStorm не понимает правильно методы:
$b->set('a', 10);
var_dump($b-get('a'));
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733566
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я там в варианте 'a' допустил небольшую ошибку - public >static< function getInstance(). :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
an0nym@MacBook-Air-an0nym.local ~ $ php test.php a 1000000
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
0.6561861038208
0.65943384170532
0.65889692306519
1.4924190044403
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733567
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

хороший вопрос. Я не знаю.
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733570
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergean0nym,
Это типа опроса?Скорее не опрос в привычном понимании данного слова, а мозговой штурм минусов разных подходов. Я на данный момент больше склоняюсь к подходу один, но меня тем не менее смущает static переменная внутри метода - получается некоторый отход от ООП парадигмы. Но костыли с реализацией синглтона в других подходах меня смущают еще больше. Копипасту имплементации в каждом классе вообще считаю злом.
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733578
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettЯ бы предпочел вариант A (хотя раньше делал вариант C), мне они кажутся более простыми и логичными.
Вопрос в том, как заставить редакторы понимать инстанс правильно?В будущем можно будет делать так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?php
class Singleton {
    public static function getInstance() {
        static $instance;
        return $instance ?: $instance = new static;
    }
}

class a {
    use Singleton;

    public function testa() {}
}

a::getInstance()->testa();

(PHPStorm 4.0 EAP понимает, PHPStorm 3.0 возможно нет - в нём вроде не было поддержки trait'ов.)
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733579
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
abstract class Singleton {
    public static function getInstance()
    {
        return new static;
    }
    protected function __construct(){}
    protected function __clone(){}
}
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733580
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор(PHPStorm 4.0 EAP понимает, PHPStorm 3.0 возможно нет - в нём вроде не было поддержки trait'ов.)

Буквально позавчера читал про это нововведение. ПХП становится все ООПшнее.
В Yii подобная реализация имеется (не смотрел как там сделано), называется behavior
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733591
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
abstract class Singleton {
    public static function getInstance()
    {
        return new static;
    }
    protected function __construct(){}
    protected function __clone(){}
}


Ой, все, мне идти спать надо, показало что оно работает, сидел думал почему, оказалось что просто проверил не правильно.
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733592
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я там в своем синглетоне опечатался, надо так конечно.

Код: php
1.
 return $instance ?: $instance = new static;
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37733844
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
 return isset(self::$instances[$class]) ? self::$instances[$class] : self::$instances[$class] = new static;


это уже нифига не синглтон. это уже фабрика.
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37734035
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
abstract class singleton {

    protected static $_instance;

    final private function __construct() {

    }

    final private function __clone() {

    }

    final public static function getInstance() {
        return static::$_instance ? : static::$_instance = new static();
    }

}


?
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37734056
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой использовать надо решать исходя из требований проекта. если только php 5.3 и выше то одна реализация, если нужна совместимость с 5.2 или ниже, другая и т.д. разницы особой нет.
главное не увлекаться им в принципе. иначе от его использования может быть проблем больше чем профита)
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37734231
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow
Код: php
1.
 return isset(self::$instances[$class]) ? self::$instances[$class] : self::$instances[$class] = new static;


это уже нифига не синглтон. это уже фабрика.
тогда уж не фабрика а реестр. И если сингтонов много почему бы в реестр не переконвертировать?
Имхо А лучший если брать из предоставленых. Больше на реестр похож, только реализован не на фабрике а на наследовании.
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37734264
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РенатИ если сингтонов много почему бы в реестр не переконвертировать?

если синглтонов много - значит чтото не так в архитектуре. зачем их много?
зачастую синглтоны суют везде где даже не нужно, и туда где без них прекрасно можно обойтись
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37734276
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u...зачастую синглтоны суют везде где даже не нужно, и туда где без них прекрасно можно обойтись
На пхп, яве, на сишарпе писал - никогда по жизни синглтоны не требовались. Имхо, слово красивое - мода пошла. :)
...
Рейтинг: 0 / 0
Какую имплементацию синглтона выбираете вы?
    #37734309
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeНа пхп, яве, на сишарпе писал - никогда по жизни синглтоны не требовались. Имхо, слово красивое - мода пошла. :)
да похоже на моду. даже разработчики php в доках пишут что синглтон это ахтунг, и надо юзать его очень осторожно. а некоторые вообще считают его антипаттерном(ибо почти тоже самое что global variables).
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Какую имплементацию синглтона выбираете вы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]