Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Singleton vs Static

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: в чем разница
White
Отправлено: 13 Августа, 2011 - 17:12:01
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




пытаюсь понять в чем собственно предназначение синглтона.
если есть например такой класс
PHP:
скопировать код в буфер обмена
  1. class singleton {
  2.   private static $instance;
  3.   public $some_property;
  4.  
  5.   private function __construct() {}
  6.   public function start() {
  7.     if(!isset(self::$instance)) self::$instance = new singleton;
  8.     return self::$instance;
  9.   }
  10.  
  11.   public function msg_print() {
  12.     echo $this->some_property;
  13.   }
  14. }
  15.  
  16. $obj = singleton::start();
  17. $obj->some_property = 'HELLO WORLD';
  18. $obj->msg_print();

т.е простейший синглтон, с одним свойством и одним методом, и такой класс:
PHP:
скопировать код в буфер обмена
  1. class static_class {
  2.   public static $some_property;
  3.  
  4.   private function __construct() {}
  5.  
  6.   public static function msg_print() {
  7.     echo self::$some_property;
  8.   }
  9. }
  10.  
  11. static_class::$some_property = 'HELLO WORLD';
  12. static_class::msg_print();

т.е. имеющий только статические свойства и методы, и не имеющий конструктора.
оба этих класса абсолютно взаимозаменяемы, но работа со вторым по мне удобней. отсюда и вопрос, если объект у класса может быть всего один(синглтон), нужен ли он вообще, не проще ли реализовать то же самое через статические методы и свойства?


-----
if(time()>1356048000) die();
 
 Top
OrmaJever Модератор
Отправлено: 13 Августа, 2011 - 21:19:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




не всё можно решить статическими методами.
(Добавление)
например обьект это переменая которую можно передать параметром в функцию и с ним работать, а при статических методах так зделать не сможем.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
White
Отправлено: 13 Августа, 2011 - 21:46:05
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




OrmaJever пишет:
передать параметром в функцию и с ним работать

ну а статические методы класса вызывать непосредственно из функции. если речь идет про объекты разных классов, то имя класса также можно передать в параметре функции.
пока что не убедили, если можно конкретный пример.


-----
if(time()>1356048000) die();
 
 Top
OrmaJever Модератор
Отправлено: 13 Августа, 2011 - 22:50:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




White ну если нравится такой подход то некто не против, конкретно в этом случае всё разницы нету, только в написании.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
White
Отправлено: 13 Августа, 2011 - 23:11:55
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




OrmaJever дело не в нравится - не нравится. я понимаю, что если такой паттерн как синглтон существует, то предназначен для упрощения реализации решения определенных задач. пока что для себя разницы между синглтоном и приведенным выше подходом не нашел (читаемость кода при втором подходе лучше) , что натолкнуло меня на мысль о неправильном использовании мною этого паттерна.
я понимаю, что где-то ввел себя в заблуждение, но не могу понять где.


-----
if(time()>1356048000) die();
 
 Top
OrmaJever Модератор
Отправлено: 14 Августа, 2011 - 00:24:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




White пишет:
то предназначен для упрощения реализации решения определенных задач.

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

ну конешно эти 2 кода эдентичны, так же как и
PHP:
скопировать код в буфер обмена
  1. function a($text) {
  2.   return $text.'<br>';
  3. }
  4. echo a('текст');
  5. class a {
  6.    prinvate $a = null;
  7.    public function __construct($text) {
  8.         $this->a = $text;
  9.    }
  10.    public function a() {
  11.        return $this->a.'<br>';
  12.    }
  13. }
  14. $a = new a('текст в классе');
  15. echo $a->a();

вот правда же этим примеров нельзя описать полезность классов? Так же и с примером в первом посте, всё познаётся в большом проэкте.
White пишет:
читаемость кода при втором подходе лучше

а по мне -> красивее выгледит чем :: Подмигивание
ps. надо найти какой-нибудь класс в популярных cms и попробовать переделать под синглтон и статический подход, и уверяю не всё получится.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
White
Отправлено: 14 Августа, 2011 - 10:13:24
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




OrmaJever пишет:
всё познаётся в большом проэкте

в том то и дело, что я начал применять такой подход для написания небольшой cms (до этого в схожем проекте применял синглтоны), и пока не нашел разницы. если есть желание глянуть могу прикрепить исходники (проект еще далек от готовности, но уже функционирует).
по поводу читаемости:
поскольку речь идет о синглтоне, а одно из его достоинств, это то что объект может быть достигнут внутри функции, наиболее часто применяется такая конструкция:
PHP:
скопировать код в буфер обмена
  1.    
  2. class singleton {
  3.       private static $instance;
  4.       public $some_property;
  5.      
  6.       private function __construct() {}
  7.       public function start() {
  8.         if(!isset(self::$instance)) self::$instance = new singleton;
  9.         return self::$instance;
  10.       }
  11.      
  12.       public function msg_print() {
  13.         echo $this->some_property;
  14.       }
  15. }
  16.      
  17.     $obj = singleton::start();
  18.     $obj->some_property = 'HELLO WORLD';
  19.     foo();
  20.  
  21. function foo() {
  22.     $obj = singleton::start();
  23.     $obj->msg_print();
  24. }
  25.  


во втором примере заменится на:

PHP:
скопировать код в буфер обмена
  1.  
  2. class static_class {
  3.       public static $some_property;
  4.      
  5.       private function __construct() {}
  6.      
  7.       public static function msg_print() {
  8.         echo self::$some_property;
  9.       }
  10. }
  11.    
  12. static_class::$some_property = 'HELLO WORLD';
  13. foo();
  14.  
  15. function foo() {
  16.     static_class::msg_print();
  17. }
  18.  


разве 2 пример менее читаемый?
OrmaJever пишет:
раздельные переменые связывающиеся именем класа


здесь все-таки не соглашусь (и вероятно окажусь не прав Закатив глазки ). класс ведь это та же единая сущность (достигаемая разве-что не с помощью $this-> а self:: внутри класса). все 3 основных парадигмы ооп вполне применимы к этой сущности так же как и к объекту.
пожалуй несколько примеров того что все таки не достигается обращением к классу а не к объекту:
1.динамическое объявление свойств.
2.отсутствие конструктора и деструктора (впрочем первый синглтону ни к чему, а вот второго без объявления объектов действительно не будет)
3.перегрузка (хотя с php5.3 шаги в этом напрвлении делаются).
OrmaJever пишет:
не конкретно синглтона и второго подхода

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

(Отредактировано автором: 14 Августа, 2011 - 13:58:28)



-----
if(time()>1356048000) die();
 
 Top
EuGen Администратор
Отправлено: 15 Августа, 2011 - 09:29:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




http://ru.wikipedia.org/wiki/Singleton#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_.D0.BD.D0.B0_PHP_5 пишет:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class Singleton {
  3.  
  4.     protected static $instance;  // object instance
  5.  
  6.     /**
  7.      * Защищаем от создания через new Singleton
  8.      *
  9.      * @return Singleton
  10.      */
  11.     private function __construct() { /* ... */ }
  12.  
  13.     /**
  14.      * Защищаем от создания через клонирование
  15.      *
  16.      * @return Singleton
  17.      */
  18.     private function __clone() { /* ... */ }
  19.  
  20.     /**
  21.      * Возвращает единственный экземпляр класса
  22.      *
  23.      * @return Singleton
  24.      */
  25.     public static function getInstance() {
  26.         if ( is_null(self::$instance) ) {
  27.             self::$instance = new Singleton;
  28.         }
  29.         return self::$instance;
  30.     }
  31.  
  32.     public function doAction() { /* ... */ }
  33.  
  34. }
  35.  
  36. //usage
  37. Singleton::getInstance()->doAction();
  38. ?>
  39.  

Теперь можно почитать комментарии и понять некоторую конкретную разницу.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
White
Отправлено: 15 Августа, 2011 - 10:11:08
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




EuGen вопрос не в том что такое синглтон, и как он отличается от описанного выше подхода.
вопрос в том, что в обоих подходах действия происходят с единой сущностью. если в случае с синглтоном это единственный экземпляр класса и его свойства и методы, то во втором случае это сам класс и его статические свойства и методы.
PHP:
скопировать код в буфер обмена
  1. class some_class {
  2.     private function __construct() { }
  3.     private function __clone() { }
  4.     public static function doAction() { /* ... */ }
  5. }
  6. some_class::doAction();

переформулируем немного вопрос. какого именно результата мы не сможем достичь с данным подходом, и сможем достичь с приведенным вами выше синглтоном? если не сложно конкретный пример.

(Отредактировано автором: 15 Августа, 2011 - 10:12:01)



-----
if(time()>1356048000) die();
 
 Top
Stierus Супермодератор
Отправлено: 15 Августа, 2011 - 11:36:13
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Ответ, по-моему, очевиден - в синглотне есть экземпляр класса, в стат. методах и свойствах - нет. Из этого вытекает большое количество различий при ООП кодинге. Как один из примеров - у нас есть 4 реализации хранилища (файлы, бд, мемкеш и куки, например). Все хранилища описываются 1 общим интерфейсом, всех должно быть не более, чем по 1 экземпляру. Приложение можно написать 2 способами(как минимум) :
1. передавая экземпляр класса, поддерживающего интерфейс хранилища в параметре функции
2. Как предложил выше ты - запрашивая стат методы до вызова функции

Нам потребовалось перевести хранение данных корзины из базы данных в куки (тем более, если есть необходимость выбирать хранилище в зависимости от логики) - в первом случае мы ввели в конструктор синглтона логику определения, экземпляр какого класса нужно отдавать и хранить (синглтон стал фабрикой) - на этом все изменения закончились, в случае же если мы пользовались стат методами и свойствами - нам нужно найти все места в коде с вызовами типа DbEngine::... и заменить на CookieEngine::... в лучшем случае (когда нужно просто заменить хранилище) и ломать голову, куда поместить эту логику выбора хранилища в случае, если нужно хранить и в бд и в куках.

Это один, самый очевидный пример. Когда что-то делаешь - нужно понимать, что и зачем ты делаешь, какие задачи в будущем можешь встретить.
(Добавление)
передавая экземпляры классов как параметры функций, уменьшается взаимосвязь компонент между собой. Например есть 2 библиотеки - одна отвечает за сохранение информации в файл, вторая отвечает за просмотр кук и сохранение какой-то строки в файл, если кука равна 10, например (вполне встречаемый кейс для аналитиков). Вот вторую либу можно сделать зависимой от первой (внутри библиотеки жестко вызывать методы первой либы или создавать экземпляр - не важно), а можно сделать независимой (принимать в качестве параметра экземпляр первой либы и с помощью этого экземпляра сохранять данные). Думаю, не стоит объяснять, что второй метод облегчит тебе жизнь, в случае, если меняются алгоритмы сохранения или в случае, если первая либа стала платной и заказчик удалил ее с сервера.

Есть инверсия зависимостей, dependency injection - много умных слов, касающихся зависимостей классов и методов их связывания между собой ... читай, учись и все будет понятнее и понятнее Улыбка
 
My status
 Top
White
Отправлено: 15 Августа, 2011 - 13:43:53
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




Stierus пишет:
синглтон стал фабрикой
т.е. насколько я понял некий синглтон-строитель. это пожалуй имеет смысл, сам задумывался над такой реализацией, и невозможностью ее применения во втором случае.
Stierus пишет:
DbEngine::... и заменить на CookieEngine::
если игнорировать инкапсуляцию, пожалуй да, но если спроектировать класс предоставляя скажем методы read() и write() и предоставить им выбор интерфейса хранилища, пожалуй нет.
со вторым примером понятно.

Спасибо, немного прояснилась ситуация.


-----
if(time()>1356048000) die();
 
 Top
Stierus Супермодератор
Отправлено: 17 Августа, 2011 - 18:25:38
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Про какую инкапсуляцию ты говоришь в статических классах?
 
My status
 Top
White
Отправлено: 17 Августа, 2011 - 19:11:38
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




PHP:
скопировать код в буфер обмена
  1. class basket {
  2.  public static function read() {
  3.   if(isset($_COOKIE['id'])) self::cookie_read();
  4.   else self::db_read();
  5.  }
  6.  
  7.  private static function cookie_read() {
  8.   ...
  9.  }
  10.  
  11.  private static function db_read() {
  12.   ...
  13.  }
  14. }

про такую например


-----
if(time()>1356048000) die();
 
 Top
Stierus Супермодератор
Отправлено: 18 Августа, 2011 - 10:10:09
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




ясн
 
My status
 Top
OrmaJever Модератор
Отправлено: 18 Августа, 2011 - 11:16:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Статическими методами можно зделать тоже многое, но тут всётаки разница в том что в синглтоне есть обьект. Ну вот например мы пишем плагин для некой cms, у cms есть функция X которая выводит информацию о плагине в админку и принимает в качестве параметра обьект со свойствами version, description и т.д. И этой функции както наплевать где вы возьмёте этот обьект, один ли он или их пять.
Это чисто пример который может быть, синглтон не нужен везьде и всегда, но иногда будет тот один случай когда он пригодится.
ps. если писать свой код то его можно зделать под любой стиль, а в комерческих проэктах приходится подстраиватся под других


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB