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

 PHP.SU

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


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

> Без описания
Stierus Супермодератор
Отправлено: 19 Октября, 2011 - 09:10:32
Post Id



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


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


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




Цитата:
Хотя смотря в каком контексте - если всунете в функцию без "&" - все, будет скопирован весь объект..
Объекты по умолчанию передаются по ссылкам, если вам нужно копирование - надо вручную клонировать.

По поводу синглтона - он вам не нужен Улыбка Синглтон - это средство ограничить количество экземпляров класса. Он ровно 1 Улыбка, поэтому
PHP:
скопировать код в буфер обмена
  1. $a = A::getInstance(1);
  2. $b = A::getInstance(2);

будут вести на один и тот же объект, а один и тот же объект будет отдавать одно и то же Улыбка
Вам нужна фабрика (http://www[dot]javenue[dot]info/post/17 или любая другая ссылка из яндекса по запросу "паттерн фабрика"). Почитайте про ООП и паттерны проектирования, у вас в голове явно каша Улыбка

ps
Объекты для того и создаются что бы их передавать в методы других классов, при ООП-программировании не нормально этого не делать.
 
My status
 Top
zdlr
Отправлено: 19 Октября, 2011 - 12:26:46
Post Id


Новичок


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


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




Stierus пишет:
Цитата:
Хотя смотря в каком контексте - если всунете в функцию без "&" - все, будет скопирован весь объект..
Объекты по умолчанию передаются по ссылкам, если вам нужно копирование - надо вручную клонировать.

По поводу синглтона - он вам не нужен Улыбка Синглтон - это средство ограничить количество экземпляров класса. Он ровно 1 Улыбка, поэтому
PHP:
скопировать код в буфер обмена
  1. $a = A::getInstance(1);
  2. $b = A::getInstance(2);

будут вести на один и тот же объект, а один и тот же объект будет отдавать одно и то же Улыбка
Вам нужна фабрика (http://www[dot]javenue[dot]info/post/17 или любая другая ссылка из яндекса по запросу "паттерн фабрика"). Почитайте про ООП и паттерны проектирования, у вас в голове явно каша Улыбка

ps
Объекты для того и создаются что бы их передавать в методы других классов, при ООП-программировании не нормально этого не делать.



Спасибо за советы я ко всем прислушаюсь. Для того и пришел на форум, так как иначе спросить неукого, свою правоту я не собираюсь доказывать, так как сам не все до конца понимаю правильно.

Теперь мне про сингтон стало все на свои места. Уже третий раз встречаю что его более используют при конекте к базе данных что я у себя прослежу и перепишу.

Конечно у меня есть каша в понимании всего ООП. Хотя я и написал довольно большую работу на нем, но все же мне некоторые моменты непонятно. Все что я читал по ООП это только по сути мануал на PHP.net

Цитата:
Объекты для того и создаются что бы их передавать в методы других классов, при ООП-программировании не нормально этого не делать.


То есть если я вас правильно понял контрукция что я писал выше:

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.  


Не есть страшное? А вполне нормально?

Спасибо за советы.

Если еще можно, подскажите еще момент, вот тут в теме мне написали:

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


Мне немного непонятно для чего тогда пишутся extends классы? Неужели я в главном классе Core не могу создать метод Get($id) и по нему не запрашивать из базы данных данные.

Тогда класс News extends Core - почему я в нем не могу использовать Get()?

Спасибо за ваше время.
 
 Top
caballero
Отправлено: 19 Октября, 2011 - 13:09:25
Post Id


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


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


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




Цитата:
Почитайте про ООП и паттерны проектирования, у вас в голове явно каша

как только полезет в нафиг ему не нужные паттерны каши станет еще больше.

Цитата:
Мне немного непонятно для чего тогда пишутся extends классы? Неужели я в главном классе Core не могу создать метод Get($id) и по нему не запрашивать из базы данных данные.

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


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


Новичок


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


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




caballero пишет:
Цитата:
Почитайте про ООП и паттерны проектирования, у вас в голове явно каша

как только полезет в нафиг ему не нужные паттерны каши станет еще больше.

Цитата:
Мне немного непонятно для чего тогда пишутся extends классы? Неужели я в главном классе Core не могу создать метод Get($id) и по нему не запрашивать из базы данных данные.

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


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

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


Я прочитал это не смог понять, неужели нельзя делать так:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class A{
  4.     public $a;
  5.  
  6.     public function Set($n){
  7.         $this->a = $n;
  8.     }
  9. }
  10.  
  11. class B extends A{
  12.     public function Get(){
  13.         echo $this->a;
  14.     }
  15. }
  16.  
  17.  
  18. $a = new B();
  19.  
  20. $a->Set(100);
  21. $a->Get();
  22. ?>
  23.  
 
 Top
caballero
Отправлено: 19 Октября, 2011 - 14:10:23
Post Id


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


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


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




технически можно сделать (только private $a; иначе зачем вообще Get и Set)

если есть смысл согласно бизнес-логики


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



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


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


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




Класс - это цельная сущность, она должна быть самодостаточной. Если в классе есть получение внутриклассовых переменных - задаваться они должны там же. Наследование нужно для уменьшения кода Улыбка . Есть у вас сущность "товар" ... с товаром можно совершать кучу вещей - продать, добавить в корзину, получить количество на сайте и тд. Но вот у вас появляется электронный товар. Что делать? выделять класс baseGood в который выносить все, что относится и к физическим и к электронным товарам (песни, электронные книги, видео) - это положить в корзину, узнать цену, оформить заказ и тд ... это немаленький список функций. НУ а то, что относится только к физическим товарам - создать отдельный класс и наследовать от baseGood (тут добавляют методы получения количества на складе, узнать стоимость доставки и тд) ... потом появится товар, у которго нужно узнавать цвет, размер, теплоемкость и тд.

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


Теперь касательно вашего наследования от core ... что вы будете делать, если вас попросят все новости хранить в файлах (ну или там из мемкеша брать - не важно) ?
 
My status
 Top
zdlr
Отправлено: 19 Октября, 2011 - 17:10:42
Post Id


Новичок


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


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




Stierus пишет:
Класс - это цельная сущность, она должна быть самодостаточной. Если в классе есть получение внутриклассовых переменных - задаваться они должны там же. Наследование нужно для уменьшения кода Улыбка . Есть у вас сущность "товар" ... с товаром можно совершать кучу вещей - продать, добавить в корзину, получить количество на сайте и тд. Но вот у вас появляется электронный товар. Что делать? выделять класс baseGood в который выносить все, что относится и к физическим и к электронным товарам (песни, электронные книги, видео) - это положить в корзину, узнать цену, оформить заказ и тд ... это немаленький список функций. НУ а то, что относится только к физическим товарам - создать отдельный класс и наследовать от baseGood (тут добавляют методы получения количества на складе, узнать стоимость доставки и тд) ... потом появится товар, у которго нужно узнавать цвет, размер, теплоемкость и тд.

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


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


Вы правильно все пишите, и это можно прочесть везде. Я только до конца не понимаю как реализовать то что вы пишите. Если мне нужно будет брать новости из файлов, как быть я пока незнаю, я бы переписал Get(); а лучше написал другой метод работающий с файлами и запрашивал не Get() а GetFromFile() чтото такое.

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

Извините. Потому как бы и затеял этот разговор. И все. Вот сел час назад просто для себя почитать, набрал ОПП PHP статьи. И все что можно прочитать это примитив и не более. Нормально понять как все работает не так и сложно но есть моменты.

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

А как иначе никто нормально не может обьяснить. И тем более в такое положение вещей я попал когда только начал ООП изучать, мне достался класс с которым нужно было работать а он так и работал, от туда я и нахватался вероятно как сейчас выходит не очень правильного подхода.

Если есть минутся рассказать - прошу помоши.
 
 Top
Stierus Супермодератор
Отправлено: 19 Октября, 2011 - 18:03:17
Post Id



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


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


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




Если вы хотите конкретные советы по коду - выставляйте свой код, а так вы и будете получать абстрактные советы. Насчет доступа к данным я сегодня писал в соседнем топике http://forum.php.su/topic.php?fo...2&topic=1451
 
My status
 Top
caballero
Отправлено: 19 Октября, 2011 - 18:08:10
Post Id


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


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


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




Цитата:
Сейчас у меня как все построено. Есть класс я его зову ядро, он умеет только работать с базой данных, берет, кладет, удаляет, обновляет. Далее если нужно новости напрмер - я пишу расширение класса, и беру ядро как родителя. И у же в классе новостей пишу - Дайте данные - и уже с ними работаю (примитивно описываю но по сути).

По такому принципу строятся решения типа ActiveRecord например
Цитата:
А как иначе никто нормально не может обьяснить

Иначе - можно сотней способов, например вообще без классов.


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


Новичок


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


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




Немного патовая ситуация.

Конечно я понимаю что реализаций миллион может быть. Просто мне написали что так как я все делаю это не правильно и это каша. Что нельзя чтоб класс Новостей зависел от материнского класса и все такое. Что если в материнском классе поменяются названия методов то нужно будет и классно новостей переписывать. И я конечно могу с этим согласиться. Потому и спрашиваю - а как грамотно писать? Чтоб и класс новостей не зависел от материнского от куда он и запрашивает данные. Мне то как раз и стало интересно как так писать чтоб класс новостей мог сам данные выгребать но при этом был сам по себе. Неужели я должен в каждом классе описывать с нуля логику работы с данными получаемыми из базы данных.

Ладно, мы более скатились в какую-то философию.
 
 Top
Stierus Супермодератор
Отправлено: 20 Октября, 2011 - 09:51:20
Post Id



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


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


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




zdlr, вы ссылку, которую я выше оставил, открывали?
 
My status
 Top
zdlr
Отправлено: 20 Октября, 2011 - 10:22:58
Post Id


Новичок


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


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




Stierus пишет:
zdlr, вы ссылку, которую я выше оставил, открывали?


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

Попробую проработать этот вопрос.
 
 Top
Stierus Супермодератор
Отправлено: 20 Октября, 2011 - 10:37:28
Post Id



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


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


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




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

то есть вместо функции getPosts()
будет функция getPosts($dao)

а внутри getPosts вместо колбасинга запросов к бд, будет return $dao->get(...)

зы
dao - Data Access Object
 
My status
 Top
zdlr
Отправлено: 23 Октября, 2011 - 23:05:53
Post Id


Новичок


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


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




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

то есть вместо функции getPosts()
будет функция getPosts($dao)

а внутри getPosts вместо колбасинга запросов к бд, будет return $dao->get(...)

зы
dao - Data Access Object


Спасибо за советы. Вот теперь мне становится многое понятнее. Благодарю за помощь.
 
 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