Вот хоть убейте, но я не могу понять, какой смысл использовать синглтон, если можно использовать обыкновенный статический класс. Не забрасывайте меня сразу же камнями, если я вдруг чего-то не догоняю, я здесь не для того, чтобы доказывать бессмысленность синглтона, я здесь для того, чтобы понять его предназначение и вообще смысл использования, учитывая на мой взгляд существование более оптимальной альтернативы.
Вот к примеру пример из вики:
<?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 наследует его.
И все! Мы потеряли наследование.
Представим, что есть некоторый класс 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](http://phpforum.su/html/emoticons/wink.gif)
error_reporting(E_ALL | E_STRICT);
Спустя 44 минуты, 28 секунд (15.08.2012 - 16:53) Revan написал(а):
Цитата (killer8080 @ 15.08.2012 - 14:09) | ||
а перед вызовом включи ![]() 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.* никаких ошибок нет, если методы родительского класса тоже статические, но и даже если не статические, то все равно вызываются, хоть и с ошибкой ![]() |
Это было сказано к этому коду
Цитата (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) | ||||
Это было сказано к этому коду
Нельзя обращаться к методам, как к статическим, если они не объявлены таковыми. |
Я этот код на ходу написал, забыл сделать их статическими)
Спустя 7 часов, 41 минута, 39 секунд (16.08.2012 - 01:04) SlavaFr написал(а):
Цитата (Revan @ 15.08.2012 - 02:54) |
Вот хоть убейте, но я не могу понять, какой смысл использовать синглтон, если можно использовать обыкновенный статический класс. |
в singelton мы можем быть уверенны, что всегда будет существовать только одна единственная инстанция класса.
Конечно можно все заменить на статические переменные и методы и с ними работаь, но это не будет похоже на OOP а на попытку всунуть линейное программирование в классы.
_____________
FC Barcelona - она всегда будет в моем сердце!