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]   

> Описание: Наследование классов
fid
Отправлено: 08 Июля, 2011 - 10:42:21
Post Id



Новичок


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


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




Подсмотрел в учебнике пример про полиморфизм, но не суть, в задаче определяют два класса, второй в другом файле. При определении второго класса используется переменная $article, которая нигде не определена. Эти примеры работают я проверял, но только не могу понять откуда мы берем $article, если переменная заранее нигде не определена.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. class Article
  4. {
  5.         var $id;
  6.         var $title;
  7.         var $content;
  8.        
  9.         function Article($id, $title, $content)
  10.         {
  11.                 $this->id = $id;
  12.                 $this->title = $title;
  13.                 $this->content = $content;
  14.         }
  15.        
  16.         //  Функция для вывода статьи
  17.         function view()
  18.         {
  19.                 echo "<h1>$this->title</h1><p>$this->content</p>";
  20.         }
  21. }
  22.  
  23. // Теперь определяется другой класс в другом файле
  24.  
  25. <?PHP
  26.  
  27. require_once('ex5.php');
  28.  
  29. class ArticleList
  30. {
  31.         var $alist; // Здесь определяется массив который хранит набор статей
  32.        
  33.         function add(Article $article) // Метод принимает переменную класса Article
  34.         {
  35.                 $this->alist[] = $article; // Экземпляр класса Article записывает в массив
  36.         }
  37.        
  38.         //  Вывод статей
  39.         function view()
  40.         {
  41.                 foreach($this->alist as $article)
  42.                 {
  43.                         $article->view();
  44.                         echo '<hr />';
  45.                 }
  46.         }
  47. }

(Отредактировано автором: 08 Июля, 2011 - 13:35:22)

 
 Top
molchun201
Отправлено: 08 Июля, 2011 - 10:49:19
Post Id



Посетитель


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


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




require_once('ex5.php'); наследуется кусок кода где определена $article

ПС в классах так не пишут: var $id; - var - это стиль пхп 4, рекомендуется писать так: public $id;


-----
Обрамляйте код тегами и читайте
 
 Top
fid
Отправлено: 08 Июля, 2011 - 10:50:38
Post Id



Новичок


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


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




Так вот всё дело в том что я привожу здесь целиком класс Article, и в полях нет $article
 
 Top
molchun201
Отправлено: 08 Июля, 2011 - 10:54:29
Post Id



Посетитель


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


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




значит $article определяется динамически
(Добавление)
или ошибка в листинге учебника - это не редкость


-----
Обрамляйте код тегами и читайте
 
 Top
fid
Отправлено: 08 Июля, 2011 - 10:55:53
Post Id



Новичок


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


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




Про динамическое определение, имеется ввиду вот эта строчка во втором классе в методе?


Ошибки нет, я набрал пример, код работает без определения $article

(Отредактировано автором: 08 Июля, 2011 - 10:57:38)

 
 Top
White
Отправлено: 08 Июля, 2011 - 10:58:12
Post Id



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


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


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




$article в данном случае не переменная, а экземпляр объекта класса Article. Точно таким же образом можно было бы дать ему другое имя


-----
if(time()>1356048000) die();
 
 Top
molchun201
Отправлено: 08 Июля, 2011 - 10:58:21
Post Id



Посетитель


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


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




fid пишет:
Про динамическое определение, имеется ввиду вот эта строчка во втором классе в методе?
да
(Добавление)
хотя она начала уже преобразовываться раньше, но в пхп прав последний


-----
Обрамляйте код тегами и читайте
 
 Top
fid
Отправлено: 08 Июля, 2011 - 11:02:39
Post Id



Новичок


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


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




С динамическими переменными всё ясно, а вот экземпляр объекта класса можно совершенно произвольно вводить в любом месте кода получается?

(Отредактировано автором: 08 Июля, 2011 - 11:07:05)

 
 Top
White
Отправлено: 08 Июля, 2011 - 11:23:39
Post Id



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


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


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




CODE (htmlphp):
скопировать код в буфер обмена
  1. function add(Article $article)


в инициализации функции вы говорите что объект $article новый экземпляр класса Article, он будет доступен только внутри функции, далее

CODE (htmlphp):
скопировать код в буфер обмена
  1. $this->alist[] = $article


вы записываете этот объект в массив который принадлежит ArticleList, для вызова этого обьекта внутри класса используйте $this->alist[номер статьи];

P.S. Не понятно зачем так извращаться, можно было просто в классе Article создать свойство
CODE (htmlphp):
скопировать код в буфер обмена
  1. private static $alist=array();

и функции
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. public function Article($id, $title, $content) {
  3.   $this->id = $id;
  4.   $this->title = $title;
  5.   $this->content = $content;
  6.   self::$alist[]=$this;
  7. }
  8. public function viewAll() {
  9.   foreach(self::$alist as $article) {
  10.     $article->view();
  11.   }
  12. }
  13.  


-----
if(time()>1356048000) die();
 
 Top
fid
Отправлено: 08 Июля, 2011 - 11:26:46
Post Id



Новичок


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


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




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

fid пишет:
в инициализации функции вы говорите что объект $article новый экземпляр класса Article, он будет доступен только внутри функции, далее

ну скорее всего он доступен внутри всего класса получается

(Отредактировано автором: 08 Июля, 2011 - 11:29:14)

 
 Top
White
Отправлено: 08 Июля, 2011 - 11:37:10
Post Id



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


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


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




fid пишет:
ну скорее всего он доступен внутри всего класса получается

доступен как $this->alist[его порядковый номер] внутри, и даже за пределами класса, но как $article только внутри функции add()


-----
if(time()>1356048000) die();
 
 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