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 :: ошибка: argument must be an instance of ShopProduct, array given... и т.д.

 PHP.SU

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


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

> Описание: срздан класс class ShopProductWriter и при реализации выводит ошибку
yurivmas
Отправлено: 20 Февраля, 2011 - 14:08:18
Post Id


Новичок


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


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




Изучаю ООП по книге PHP, объекты, шаблоны и т.д.
Создал файл
PHP:
скопировать код в буфер обмена
  1.  class ShopProduct {}
  2. class CDProduct extends ShopProduct {}
  3.  class BookProduct extends ShopProduct {}
  4.  

И дальше создал два объекта
PHP:
скопировать код в буфер обмена
  1.  $product3 = new CDProduct("Пропавший без вести","ДДТ","Группа",
  2.                 220, 45);
  3. print "<br />{$product3->getSummaryLine()}<br /> ";
  4.  
  5.         print "Цена: {$product3 ->getPrice()}руб.<br />";
  6.     $product4 = new BookProduct("Поднятая целина", "Михаил", "Шолохов",
  7.                 950, 1320);
  8.     print "<br />{$product4->getSummaryLine()}<br /> ";
  9.  
  10.         print "Цена: {$product4 ->getPrice()}руб.<br />";

Это всё работает нормально, а вот класс
PHP:
скопировать код в буфер обмена
  1.  class ShopProductWriter {
  2.  
  3.         public $products = array();
  4.  
  5.         public function addProduct(ShopProduct $shopProduct ){     //строка 154
  6.             $this ->products[] = $shopProduct;
  7.         }
  8.  
  9.         public  function write(){
  10.             $str = "";
  11.             foreach ($this->products as $shopProduct){
  12.                
  13.                 $str .= "<br /><br />{$shopProduct -> getSummaryLine()}<br />";
  14.                 $str .= "Цена: {$shopProduct -> getPrice()}руб.<br />";
  15.             }
  16.             print $str;
  17.         }
  18. }  
  19.  
  20.      $writer1 = new ShopProductWriter();
  21.  
  22.      $products = array($product3, $product4);
  23.      
  24.      $writer1 -> addProduct($products);                            //строка 176
  25.      $writer1->write();
  26.  

Даёт ошибку:Argument 1 passed to ShopProductWriter::addProduct() must be an instance of ShopProduct, array given, called in C:\wserver\localhost\www\OOP\index.php on line 176 and defined in C:\wserver\localhost\www\OOP\index.php on line 154
Я не могу понять, что не правильно? Объекты $product3, $product4 являются объектами класса ShopProduct, $products является массивом дочерних объектов класса ShopProduct.
Просветите, пожалуйста, кто может.
Спасибо.
 
 Top
garvey
Отправлено: 20 Февраля, 2011 - 17:53:31
Post Id



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


Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010  
Откуда: Minsk


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




В методе addProduct вы указали, что первый аргумент должен иметь тип ShopProduct. Вы же передаете массив. Но элементы этого массива имеют тип ShopProduct. Вам нужно по одиночке вызывать метод addProduct().
 
 Top
OrmaJever Модератор
Отправлено: 20 Февраля, 2011 - 18:02:56
Post Id



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


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


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




Если вы только начали изучать ооп то не спешите с типами они не так важны для начала.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
yurivmas
Отправлено: 20 Февраля, 2011 - 19:07:33
Post Id


Новичок


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


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




OrmaJever пишет:
Если вы только начали изучать ооп то не спешите с типами они не так важны для начала.

Этот скласс практически в самом начале книги и я скопировал его точно, может я не правильно вызываю методы?
garvey пишет:
Вам нужно по одиночке вызывать метод addProduct().

По одиночке всё работает, если убрать переменную public $products = array(), но Мэтт Зандстра говорит, что этот класс позволяет выводить все объекты за один раз списком.
Спасибо за желание помочь.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB