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 :: Наследование классов

 PHP.SU

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


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

> Без описания
dropoff
Отправлено: 08 Января, 2012 - 16:50:36
Post Id



Посетитель


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


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




Всем привет!

Не могу никак догнать как сделать.
Мне нужно в одном классе получать и работать с методами других классов.

Т.е. есть класс страницы


Есть класс хлебных крошек


Есть класс для работы с БД
PHP:
скопировать код в буфер обмена
  1. class db
  2. {
  3. // использую _http://stefangabos.ro/php-libraries/zebra-database/
  4. }


Есть класс шаблонизатора Smarty


Есть класс постранички
PHP:
скопировать код в буфер обмена
  1. class pagination
  2. {
  3. // использую _http://stefangabos.ro/php-libraries/zebra-pagination/
  4. }


Мне нужно в классе pageAccount работать со всеми тремя классами.

Как я понял, нужно создать абстрактный класс и его наследовать уже в pageAccount(и других подобных, например pageNews...).
Например


А потом
PHP:
скопировать код в буфер обмена
  1. class pageAccount extends Pages
  2. {
  3.  
  4. }



А в классе Pages уже вызывать(?) методы других классов.
Вот не могу никак понять как удобно сделать это все.

P.S. Сори, если что-то не так описал. Я только учусь)
 
 Top
OrmaJever
Отправлено: 08 Января, 2012 - 16:54:00
Post Id



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


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


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




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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Bio man
Отправлено: 08 Января, 2012 - 16:58:35
Post Id


Постоянный участник


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


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




Ну наследованием в вашем случае многого не добьешся. Вам знакомо слово аггрегация?
Так вот, создавайте нужные объекты внутри класса. Например
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class pageAccount{
  3.         protected $_bcrumb, $_db, $_pagination;
  4.        
  5.         public function __construct(){
  6.                 $this->_bcrumb = new bcrumb();
  7.                 $this->_db = new db();
  8.                 $this->_pagination = new pagination();
  9.         }
  10.         public function bcrumb(){
  11.                 return $this->_bcrumb;
  12.         }
  13.         public function db(){
  14.                 return $this->_db;
  15.         }
  16.         public function pagination(){
  17.                 return $this->_pagination;
  18.         }
  19. }
  20. ?>
 
 Top
dropoff
Отправлено: 08 Января, 2012 - 17:20:50
Post Id



Посетитель


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


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




Но тогда ведь проще __construct сделать в классе Page и Page потом наследовать?
Чтобы не писать один и то же код постоянно в классах.
 
 Top
Bio man
Отправлено: 08 Января, 2012 - 17:24:48
Post Id


Постоянный участник


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


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




dropoff, можете наследовать класс с аггрегацией, если вам так удобней. Я просто не до конца понял что вы хотите сделать, так что не могу точно сказать как делать...
 
 Top
dropoff
Отправлено: 08 Января, 2012 - 17:33:05
Post Id



Посетитель


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


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




Я хочу сделать так, чтобы при запросе определенной страницы вызывался класс.
Собственно, класс pageAccount будет содержать получение данных юзера(личная инфа, заказы и т.д..) и отдавать в шаблон account.tpl.
Для этого и нужны классы db, bcrumb, pagination.

Классов подобных pageAccount будет много, pageNews(новости), pageCart(корзина) и т.д...
Вот и хотел сделать удобно и с меньшим количеством кода, чтобы просто унаследовать класс Page и работать сразу с БД, пагинацией и остальными нужными вещами.

Но ООП, что-то совсем не понимаю пока(
 
 Top
Bio man
Отправлено: 08 Января, 2012 - 17:41:11
Post Id


Постоянный участник


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


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




Посмотрите паттерн Фабрика (Factory). Имхо, как раз для вашего случая.
 
 Top
dropoff
Отправлено: 08 Января, 2012 - 18:12:42
Post Id



Посетитель


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


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




Bio man, Вы имеете в виду что-то по типу _http://www[dot]irbis-team[dot]com/15/23/2 ?

По поводу приведенного Вами кода выше.
Получилось, спасибо!

Но столкнулся вот с чем.
PHP:
скопировать код в буфер обмена
  1. class pageAccount
  2. {
  3.         protected $_breadcrumb;
  4.  
  5.         public function __construct()
  6.         {
  7.                 $this->_breadcrumb = new breadcrumb();
  8.         }
  9.  
  10.         public function breadcrumb()
  11.         {
  12.                 return $this->_breadcrumb;
  13.         }
  14.  
  15.         /******************************************************/
  16.         function buildBreadcrumb()
  17.         {
  18.                 return $this->_breadcrumb->add('Страница', 'account');
  19.         }
  20. }
  21.  
  22. $page = new pageAccount();
  23.  
  24. $page->buildBreadcrumb();


Но метод add ничего не возвращает, так как он там обращается к другому методу и передает туда массив(название - Страница, ссылка - account)
если делаю в нем return - нормально.

вот функция из класса breadcrumb
PHP:
скопировать код в буфер обмена
  1. function add($title, $link = '')
  2. {
  3.         //return '1';
  4.         $this->_crumb[] = array('title' => $title, 'link' => $link);
  5. }


Походу тут что-то сложнее получается.
 
 Top
caballero
Отправлено: 08 Января, 2012 - 18:17:24
Post Id


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


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


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




Цитата:
Посмотрите паттерн Фабрика (Factory). Имхо, как раз для вашего случая.

Фабрика тут вообще ни при чем

dropoff
В вашем случае - обычная агрегация. Какой объект на какой должен ссылалтся - зависит от того что эти классы делают и в каком порядке их нужно использовать. Иными словами все зависит от архитектуры сайта. А если
то просто набор классов никак с архитектурой не связаных то надо посмотреть нужны ли они. Не уверен например что для создания хлебных крошек вообще нужен класс. Коннект для БД обычно делают в виде синглетона - проблемма взаимодействия решается сама собой.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
dropoff
Отправлено: 08 Января, 2012 - 18:25:32
Post Id



Посетитель


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


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




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

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

Да и для себя хочется уяснить как это все работает. А по мануалам ничего толком понять не могу, почему и обратился к знатокам.
 
 Top
caballero
Отправлено: 08 Января, 2012 - 19:13:11
Post Id


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


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


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




Цитата:
Сейчас и занимаюсь переделкой во что-то более удобное как могу.

вот и переделай хлебные крошки в функцию и класс для БД в синглетон.

Цитата:
Да и для себя хочется уяснить как это все работает.

Как сделаешь так и будет работать. Это ж твой код. Стандартов тут нет.

(Отредактировано автором: 08 Января, 2012 - 19:13:49)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
dropoff
Отправлено: 08 Января, 2012 - 19:24:46
Post Id



Посетитель


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


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




Я спрашивал не об этом.
Понятно, что можно переделать, но пока работает....

Интересующий вопрос (несколькими постами выше) тут http://forum.php.su/topic.php?fo...39162#1326039162
Почему там не получается использовать $this->_breadcrumb->add();
 
 Top
caballero
Отправлено: 08 Января, 2012 - 19:40:31
Post Id


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


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


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




Что именно не получается? Ошибка какая или что? Тут не телепаты сидят.
Если пишет что недоступна функция то укажи ей явно public


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
dropoff
Отправлено: 08 Января, 2012 - 20:17:15
Post Id



Посетитель


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


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




Просто не добавляет хлебную крошку. Ошибок нет.
По идее должен же добавлять?

Если делаю в PHP файле просто
$breadcrumb->add('Страница', 'account');
то все норм.

Если делаю как написал тут http://forum.php.su/topic.php?fo...39162#1326039162
то ничего не выводит.

Хотя если в методе add делаю return 'что-то', то это "что-то" выводит потом.

Т.е. не выполняется
$this->_crumb[] = array('title' => $title, 'link' => $link);

Или может я чего не допонял?

Со Smarty та же штука.
Делаю
return $this->_smarty->assign('any_content', 'Any Content');
результата нет. Но тут наверное как-то иначе нужно делать. Так как массив $smarty не содержит в себе any_content.
(Добавление)
Хм....

Сделал print_r($this->_crumb); в методе $breadcrumb->add

В массиве все есть
PHP:
скопировать код в буфер обмена
  1. (
  2.     [0] => Array
  3.         (
  4.             [title] => Главная
  5.             [link] => http://test/
  6.         )
  7.  
  8. )
  9. (
  10.     [0] => Array
  11.         (
  12.             [title] => Страница
  13.             [link] => account
  14.         )
  15.  
  16. )


Но хлебная крошка "Страница" не появляется. Мистика?)

(Отредактировано автором: 08 Января, 2012 - 20:26:20)

 
 Top
caballero
Отправлено: 08 Января, 2012 - 21:57:48
Post Id


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


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


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




Возможно объект класса крошек требует некую инициализацию которая не далается когда он создается внутри


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 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