[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Singleton vs Обыкновенный статический класс
Revan
Всем привет!

Вот хоть убейте, но я не могу понять, какой смысл использовать синглтон, если можно использовать обыкновенный статический класс. Не забрасывайте меня сразу же камнями, если я вдруг чего-то не догоняю, я здесь не для того, чтобы доказывать бессмысленность синглтона, я здесь для того, чтобы понять его предназначение и вообще смысл использования, учитывая на мой взгляд существование более оптимальной альтернативы.

Вот к примеру пример из вики:


<?php
class
Singleton {
protected static $instance; // object instance
private function __construct(){ /* ... @return Singleton */ } // Защищаем от создания через new Singleton
private function __clone() { /* ... @return Singleton */ } // Защищаем от создания через клонирование
private function __wakeup() { /* ... @return Singleton */ } // Защищаем от создания через unserialize
public static function getInstance() { // Возвращает единственный экземпляр класса. @return Singleton
if ( is_null(self::$instance) ) {
self::$instance = new Singleton;
}
return self::$instance;
}
public function doAction() { /* ... */ }
}

Singleton::getInstance()->doAction(); // Применение
?>


И чем он лучше, чем:


<?php
Class
Test {
public static function doAction() { /* ... */ }
}


Test::doAction();
?>


По-моему последний пример куда проще, более оптимальный, и абсолютно ни в чем не уступает первому.



Спустя 3 часа, 35 минут, 6 секунд (15.08.2012 - 08:29) T1grOK написал(а):
А как же с наследованием?
Представим, что есть некоторый класс Some_class и класс Test наследует его.

Class Some_class{
public function some_method(){

}
}

Class Test extends Some_class {
public static function doAction() { /* ... */ }
}


И все! Мы потеряли наследование.

Спустя 4 часа, 40 минут, 7 секунд (15.08.2012 - 13:09) Michael написал(а):
Цитата (Revan)
По-моему последний пример куда проще, более оптимальный, и абсолютно ни в чем не уступает первому.

Твой последний пример - это просто вызов какой то функции.
А синглтон - это объект. И в первом случае вызывается МЕТОД этого объекта.

Спустя 2 часа, 40 минут, 31 секунда (15.08.2012 - 15:49) Revan написал(а):
T1grOK, Почему это теряется? Вот обыкновенный пример наследования:

<?php
Class
Test {
public function hello() {
echo 'Hello!';
}
}


Class Main extends Test {
public function showHello() {
self::hello();
}
}


Main::showHello(); // Это вызовет функцию hello() из родительского класса, и выведет "Hello!"


Цитата
Твой последний пример - это просто вызов какой то функции.
А синглтон - это объект. И в первом случае вызывается МЕТОД этого объекта.


Да, но это отличие, а не преимущество, насколько я понимаю. По-моему обращение к методам очень схожи между собой. Синглтон придуман для создания единственного экземпляра класса, который можно вызвать из любого места, не создавая новый экземпляр. Статический класс - это тоже глобальный набор методов и переменных, в единственном экземпляре. Вызываются так же методы класса:


DB::Query("some query");

// такой же подход, как и с объектом

DB::getInstance()->Query("Some query");

Спустя 19 минут, 34 секунды (15.08.2012 - 16:09) killer8080 написал(а):
Цитата (Revan @ 15.08.2012 - 16:49)
Main::showHello(); // Это вызовет функцию hello() из родительского класса, и выведет "Hello!"

а перед вызовом включи user posted image
error_reporting(E_ALL | E_STRICT);

Спустя 44 минуты, 28 секунд (15.08.2012 - 16:53) Revan написал(а):
Цитата (killer8080 @ 15.08.2012 - 14:09)
Цитата (Revan @ 15.08.2012 - 16:49)
Main::showHello(); // Это вызовет функцию hello() из родительского класса, и выведет "Hello!"

а перед вызовом включи user posted image
error_reporting(E_ALL | E_STRICT);

В php 5.3.* никаких ошибок нет, если методы родительского класса тоже статические, но и даже если не статические, то все равно вызываются, хоть и с ошибкой :)

Этот код работает как надо:


<?php
error_reporting(E_ALL | E_STRICT);

Class Test {
public static function hello() {
echo 'Hello!';
}
}


Class Main extends Test {
public static function showHello() {
self::hello();
}
}


Main::showHello();

Спустя 23 минуты, 27 секунд (15.08.2012 - 17:17) killer8080 написал(а):
Цитата (Revan @ 15.08.2012 - 17:53)
В php 5.3.* никаких ошибок нет, если методы родительского класса тоже статические, но и даже если не статические, то все равно вызываются, хоть и с ошибкой smile.gif

Это было сказано к этому коду
Цитата (Revan @ 15.08.2012 - 16:49)
<?php
Class Test {
public function hello() {
  echo 'Hello!';
}
}

Class Main extends Test {
public function showHello() {
  self::hello();
}
}

Main::showHello(); // Это вызовет функцию hello() из родительского класса, и выведет "Hello!"

Нельзя обращаться к методам, как к статическим, если они не объявлены таковыми.

Спустя 5 минут, 22 секунды (15.08.2012 - 17:22) Revan написал(а):
Цитата (killer8080 @ 15.08.2012 - 15:17)
Цитата (Revan @ 15.08.2012 - 17:53)
В php 5.3.* никаких ошибок нет, если методы родительского класса тоже статические, но и даже если не статические, то все равно вызываются, хоть и с ошибкой smile.gif

Это было сказано к этому коду
Цитата (Revan @ 15.08.2012 - 16:49)
<?php
Class Test {
public function hello() {
  echo 'Hello!';
}
}

Class Main extends Test {
public function showHello() {
  self::hello();
}
}

Main::showHello(); // Это вызовет функцию hello() из родительского класса, и выведет "Hello!"

Нельзя обращаться к методам, как к статическим, если они не объявлены таковыми.

Я этот код на ходу написал, забыл сделать их статическими)

Спустя 7 часов, 41 минута, 39 секунд (16.08.2012 - 01:04) SlavaFr написал(а):
Цитата (Revan @ 15.08.2012 - 02:54)
Вот хоть убейте, но я не могу понять, какой смысл использовать синглтон, если можно использовать обыкновенный статический класс.

в singelton мы можем быть уверенны, что всегда будет существовать только одна единственная инстанция класса.
Конечно можно все заменить на статические переменные и методы и с ними работаь, но это не будет похоже на OOP а на попытку всунуть линейное программирование в классы.



_____________
FC Barcelona - она всегда будет в моем сердце!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.