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 :: Singelton помогите разобраться до конца

 PHP.SU

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


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

> Без описания
zdlr
Отправлено: 18 Октября, 2011 - 22:41:44
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Окт. 2011  


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




Добрый день друзья. Я у вас новенький, но хотел бы спросить совета.

С Singelton познакомился буквально вчера. Знакомый рассказал что это наше все. Я почитал реализацию и как бы все хорошо, но кое что не понятно.

Сразу к примеру. Например есть простой класс, без синглтон.

PHP:
скопировать код в буфер обмена
  1.  
  2. class A{
  3.                 public $a;
  4.                
  5.                 public function __construct($n){
  6.                 $this->a = $n;
  7.         }
  8.                
  9.                 public function Get(){
  10.                         echo $this->a;
  11.                 }
  12.         }
  13.        
  14.         $a = new A(1);
  15.         $b = new A(2);
  16.        
  17.         $a->Get();
  18.         $b->Get();
  19.  
  20.  


На выходе получим 1 и 2.

А если мы будем использовать паттерн сингтон, то в обоих случаях будет 2?
Спасибо за ваши советы.
 
 Top
OrmaJever Модератор
Отправлено: 18 Октября, 2011 - 22:56:04
Post Id



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


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


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




zdlr пишет:
А если мы будем использовать паттерн сингтон, то в обоих случаях будет 2?

нет даже с синглтоном такой вызов выведет 1 и 2. Просто с синглтоном разработчик знает что всегда будет только одна копия обьекта (ну если он самновый не создаст)


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DeepVarvar Супермодератор
Отправлено: 18 Октября, 2011 - 22:58:58
Post Id



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


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


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




OrmaJever пишет:
если он сам новый не создаст

Ага - getInstance ??? Тут какраз защита чтоб разраб не создал еще один.
 
 Top
zdlr
Отправлено: 18 Октября, 2011 - 23:35:18
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Окт. 2011  


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




Для закрепления материала нужно все что у меня есть переписать под этот паттерн и тогда увижу и пойму как и что работает.

Спасибо за советы.
(Добавление)
Извините друзья, чтото не выходит.

Переписал я под сингтон:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class A{
  4.     private static $instance = null;
  5.     public $a;
  6.  
  7.     private function __construct($n){
  8.         $this->a = $n;
  9.     }
  10.  
  11.     public static function getInstance($data){
  12.         if (is_null(self::$instance)) {
  13.             self::$instance = new A($data);
  14.         }
  15.  
  16.         return self::$instance;
  17.     }
  18.  
  19.     public function Get(){
  20.         echo $this->a;
  21.     }
  22. }
  23.  
  24. $a = A::getInstance(1);
  25. $b = A::getInstance(2);
  26.  
  27. $a->Get();
  28. $b->Get();
  29. ?>
  30.  
  31.  


Результат - 1 и 1.

Или как грамотно тогда все это работает?

(Отредактировано автором: 18 Октября, 2011 - 23:39:57)

 
 Top
White
Отправлено: 18 Октября, 2011 - 23:48:04
Post Id



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


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


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




zdlr как раз все правильно выходит.
аргумент в функции getInstance игнорируется, так как объект уже существует, при этом возвращается ссылка на объект A::$instance.
более наглядно будет так:
PHP:
скопировать код в буфер обмена
  1. $a = A::getInstance(1);
  2. $b = A::getInstance(2);
  3.  
  4. $b->a = 10;
  5. $a->Get();
  6.  
  7. $a->a = 20;
  8. $b->Get();


-----
if(time()>1356048000) die();
 
 Top
DeepVarvar Супермодератор
Отправлено: 18 Октября, 2011 - 23:55:48
Post Id



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


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


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




zdlr пишет:
self::$instance = new A($data);

Чуток справлю:
PHP:
скопировать код в буфер обмена
  1. if (self::$instance === null)
  2.   self::$instance = new self($data);
  3. return self::$instance;

(Добавление)
Это чтобы не быть привязанным к имени синглтона.
 
 Top
zdlr
Отправлено: 19 Октября, 2011 - 00:01:35
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Окт. 2011  


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




DeepVarvar пишет:
zdlr пишет:
self::$instance = new A($data);

Чуток справлю:
PHP:
скопировать код в буфер обмена
  1. if (self::$instance === null)
  2.   self::$instance = new self($data);
  3. return self::$instance;

(Добавление)
Это чтобы не быть привязанным к имени синглтона.


Да это правильнее, но сути не меняет в данный момент.

Как сам синтаксис вызова метода использовать чтоб выдало 1 и 2?

Как быть если будут расширения класса через extends?

Ребята научите если разобрались.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Октября, 2011 - 00:04:54
Post Id



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


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


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




zdlr пишет:
чтоб выдало 1 и 2
тогда это уже не синглтон.
(Добавление)
Он таки нужен для того чтобы нельзя было переопределить что-то где-то по коду далее, например не присоединитсья к другой базе или не сменить данные у юзера.
 
 Top
zdlr
Отправлено: 19 Октября, 2011 - 00:19:50
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Окт. 2011  


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




DeepVarvar пишет:
zdlr пишет:
чтоб выдало 1 и 2
тогда это уже не синглтон.
(Добавление)
Он таки нужен для того чтобы нельзя было переопределить что-то где-то по коду далее, например не присоединитсья к другой базе или не сменить данные у юзера.


А выше эксперт написал:

Цитата:
нет даже с синглтоном такой вызов выведет 1 и 2.
Даже и незнаю что и сказать теперь.

Просто я для чего спрашиваю. У меня есть класс, который делает операции с данными. Берет из базы, кладет в нее. выдает выборки, обновляет и все такое. Я когда создавал дубликат класса - объект то передавал ему данные про то с чем он работает. С какими таблицами, директориями и все такое. В обычной форме я запросто делаю например:

PHP:
скопировать код в буфер обмена
  1.  
  2. $news = new News($data['news']);
  3. $news->showAll();
  4.  
  5. $feedback = new Feedback($data['feedback']);
  6. $feedback->showAll();
  7.  


Например так на вскидку. Что News что Feedback это расширение от класса материнского Core и передавая массив $data['news'] или $data['feedback'] им я говорим им из какой таблицы брать данные, по каким полям и все такое. Это брать берет на себя Core, а уже вывод делает метов в своем классе showAll.

Получается что если делать сингтон то получится каша?

Еще решил дописать. Чего я за этот синглтон уцепился разобраться в его работе. Иногда когда я воздаю новый объект и работаю с ним редко но пару раз мне требоволось получить доступ к свойствай другого объекта, и делал я это путем передачи одного объекта другому как параметр.

Например:

PHP:
скопировать код в буфер обмена
  1.  
  2. class A{
  3.                 public $a;
  4.                
  5.                 public function __construct($n){
  6.                 $this->a = $n;
  7.         }
  8.                
  9.                 public function Get(){
  10.                         echo $this->a;
  11.                 }
  12.                                
  13.                 public function Some($data){
  14.                         echo $data->a;
  15.                 }
  16.         }
  17.        
  18.         $a = new A(1);
  19.         $b = new A(2);
  20.        
  21.         $a->Get();
  22.         $b->Get();
  23.         $b->Some($a);
  24.  


Но у меня есть смутные сомнения что так делать правильно, хотя увидел такую реализацию у других и не раз.
(Добавление)
White пишет:
zdlr как раз все правильно выходит.
аргумент в функции getInstance игнорируется, так как объект уже существует, при этом возвращается ссылка на объект A::$instance.
более наглядно будет так:
PHP:
скопировать код в буфер обмена
  1. $a = A::getInstance(1);
  2. $b = A::getInstance(2);
  3.  
  4. $b->a = 10;
  5. $a->Get();
  6.  
  7. $a->a = 20;
  8. $b->Get();


Ваш ответ сразу не заметил, сорри. Да нет, так понятно что будет работать. Я ниже описал для чего все это затеял, что у меня есть объекты которые принимаю при создании массив с данными с чем они работают. И если $a работает с одними данными, например с таблицей и поля там какие то перечислены, а $b с другими то в случае с сингтоном они просто напросто переназначатся эти свойства класса и все? Как то я тогда не особо понимаю пользы для меня.

(Отредактировано автором: 19 Октября, 2011 - 00:34:49)

 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Октября, 2011 - 01:28:11
Post Id



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


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


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




zdlr пишет:
Что News что Feedback это расширение от класса материнского Core
Зачем пальцу уметь думать?
zdlr пишет:
передачи одного объекта другому как параметр.
Нафик такие привычки - наплОдите ссылок, потом убить объект не сможете.
Стоит сделать один общий объект, какраз синглтон у меня он называется node (узел)
Он умеет загружать классы по требованию, удалять их если надо освободить память, а освобождать её стоит в любом удобном случае. Через него передаются все данные (ну сравните с чипсетом на материнке) от класса к классу.
И передавать никому никого не надо в качестве аргумента.
Это ж умереть можно сколько ссылок наплодится, слава богу сам объект не передается полностью... Хотя смотря в каком контексте - если всунете в функцию без "&" - все, будет скопирован весь объект..

(Отредактировано автором: 19 Октября, 2011 - 01:30:03)

 
 Top
zdlr
Отправлено: 19 Октября, 2011 - 01:54:26
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Окт. 2011  


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




DeepVarvar пишет:
zdlr пишет:
Что News что Feedback это расширение от класса материнского Core
Зачем пальцу уметь думать?
zdlr пишет:
передачи одного объекта другому как параметр.
Нафик такие привычки - наплОдите ссылок, потом убить объект не сможете.
Стоит сделать один общий объект, какраз синглтон у меня он называется node (узел)
Он умеет загружать классы по требованию, удалять их если надо освободить память, а освобождать её стоит в любом удобном случае. Через него передаются все данные (ну сравните с чипсетом на материнке) от класса к классу.
И передавать никому никого не надо в качестве аргумента.
Это ж умереть можно сколько ссылок наплодится, слава богу сам объект не передается полностью... Хотя смотря в каком контексте - если всунете в функцию без "&" - все, будет скопирован весь объект..


Я и говорю что не считаю правильно передавать объект как параметр. По поводу "Зачем пальцу уметь думать?" не сильно понял, можно ли поподробнее?

Спасибо за советы.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Октября, 2011 - 02:06:12
Post Id



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


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


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




С чего вы взяли что какой-то там класс, который занимается только выводом новостей, должен быть потомком от класса БД?
Он же жить без папы не сможет, а папа будет полностью привязан к детям..
Т.е. если вы у папы измените имена методов, или допишите еще пару методов - вам придется ковырять и все классы являющиеся от него зависимыми.
Вызываются то в них не личные методы, а методы родителя.
На*** оно такое нужно?
 
 Top
zdlr
Отправлено: 19 Октября, 2011 - 02:35:11
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Окт. 2011  


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




DeepVarvar пишет:
С чего вы взяли что какой-то там класс, который занимается только выводом новостей, должен быть потомком от класса БД?
Он же жить без папы не сможет, а папа будет полностью привязан к детям..
Т.е. если вы у папы измените имена методов, или допишите еще пару методов - вам придется ковырять и все классы являющиеся от него зависимыми.
Вызываются то в них не личные методы, а методы родителя.
На*** оно такое нужно?


Правильно говорите. Для того форум и есть. Я понял о чем вы говорите. А как тогда правильно писать? Если например у меня Core имеет метод Get($id) и по нему отдает елемент, то как грамотно писать если в новостях мне не делать Get($id) и для чего тогда пишутся extends?

Спасибо за ваши советы.
 
 Top
caballero
Отправлено: 19 Октября, 2011 - 02:55:08
Post Id


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


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


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




Цитата:
Как то я тогда не особо понимаю пользы для меня

Никакой пользы поэтому и длинная дискуссия ни о чем

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


Цитата:
если всунете в функцию без "&" - все, будет скопирован весь объект

Не будет - чай не PHP4 используется

(Отредактировано автором: 19 Октября, 2011 - 03:14:15)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Октября, 2011 - 05:12:19
Post Id



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


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


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




caballero пишет:
чай не PHP4 используется

PHP:
скопировать код в буфер обмена
  1. class a {
  2.   var $aaa = array();
  3.   function __construct() {
  4.     $this->aaa = range(0,100000);
  5.     }
  6.   function getArr() {
  7.     return $this->aaa;
  8.     }
  9.   }
  10.  
  11. function b ($a) {
  12.   echo implode(","$a->getArr());
  13.   }
  14.  
  15. $a = new a;
  16. b($a);
 
 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