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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: не работает код
Данил Банаев
Отправлено: 11 Августа, 2012 - 10:11:37
Post Id


Новичок


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


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




Изучаю паттерн фабрика, в коде возникает ошибка.
Fatal error: Cannot call abstract method Render::render() in Z:\home\test\www\index.php on line 24
Помогите разобраться.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. abstract class Render{
  3.         protected $_document;
  4.         function setDocument($text){
  5.                 $this->_document=$text;
  6.         }
  7.         abstract function render();
  8. }
  9. class HTMLRenderer extends Render{
  10.         function render(){
  11.                 echo "<html>".$this->_document."</html>";
  12.         }
  13. }
  14. class XMLRenderer extends Render{
  15.         function render(){
  16.                 echo "<xml>".$this->_document."</xml>";
  17.         }
  18. }
  19. function RendererFactory(){
  20.         $accept=strtolower($_SERVER["HTTP_ACCEPT"]);
  21.         if(strpos($accept,"text/xml")>0){
  22.                 return new XMLRenderer();
  23.         }else{
  24.                 return new HTMLRenderer();
  25.         }
  26. }
  27. $render=RendererFactory();
  28. $render->setDocument("Hello");
  29. $render->render();
  30. ?>
 
 Top
Мелкий Супермодератор
Отправлено: 11 Августа, 2012 - 10:22:51
Post Id



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


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


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




Тяжёлое наследство классической реализации конструктора, имевшей место в PHP4.
0) класс при создании себя вызывает конструктор
1) в случае отсутствия конструктора у дочернего класса, вызывается конструктор родительского
2) если не описан метод __construct, вызывается метод, имеющий идентичное название с именем класса - при том, в области видимости только родительского класса.

Вот и получается, что вызывается в качестве конструктора абстрактный метод render

Я бы посоветовал переименовать класс render в AbstractRender, заодно повысив его читаемость.


-----
PostgreSQL DBA
 
 Top
Данил Банаев
Отправлено: 11 Августа, 2012 - 10:46:56
Post Id


Новичок


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


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




Мелкий пишет:
Тяжёлое наследство классической реализации конструктора, имевшей место в PHP4.
0) класс при создании себя вызывает конструктор
1) в случае отсутствия конструктора у дочернего класса, вызывается конструктор родительского
2) если не описан метод __construct, вызывается метод, имеющий идентичное название с именем класса - при том, в области видимости только родительского класса.

Вот и получается, что вызывается в качестве конструктора абстрактный метод render

Я бы посоветовал переименовать класс render в AbstractRender, заодно повысив его читаемость.


все стало понятно. спасибо большоеУлыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB