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]   

> Без описания
Ejik
Отправлено: 17 Апреля, 2013 - 17:01:34
Post Id


Гость


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


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




Собственно вот в чем загвоздка, есть класс и его наследник:
PHP:
скопировать код в буфер обмена
  1. class ArticleList
  2. {
  3.         var $alist;
  4.        
  5.         function add(Article $article)
  6.         {
  7.                 $this->alist[] = $article;
  8.         }
  9.        
  10.         //  Вывод статей
  11.         function view()
  12.         {
  13.                 foreach($this->alist as $article)
  14.                 {
  15.                         $article->view();
  16.                         echo '<hr />';
  17.                 }
  18.         }
  19. }
  20.  
  21. class ReversArticleList extends ArticleList
  22. {
  23.         var $rev;
  24.                
  25.         function add(Article $article)
  26.         {
  27.                 parent::add($article);
  28.         }
  29.        
  30.         function view()
  31.         {
  32.                 $this->rev[] = (array_reverse($this->alist));
  33.                 foreach($this->rev as $article)
  34.                 {
  35.                         $article->view();
  36.                         echo '<hr />';
  37.                 }
  38.        
  39.         }
  40. }

здесь создания объекта и вызов метода вью.
PHP:
скопировать код в буфер обмена
  1. $view = new ArticleList();
  2. $view -> add($NewsArticle_1);
  3. $view -> add($NewsArticle_2);
  4. $view -> add($NewsArticle_3);
  5. //$view -> add($ArticleImage_1);
  6. //$view -> add($CrossArticle_2);
  7. $view->view();
  8.  
  9. echo 'перевернутый массив';
  10.  
  11. $view = new ReversArticleList();
  12. $view -> add($NewsArticle_1);
  13. $view -> add($NewsArticle_2);
  14. $view -> add($NewsArticle_3);
  15. //$view -> add($ArticleImage_1);
  16. //$view -> add($CrossArticle_2);
  17. $view->view1();


так вот в таком виде php ругается
    Fatal error: Call to a member function view1() on a non-object in Z:\home\test4.ru\www\classes.php on line 115

115 строка это в классе ReversArticleList
вот что не правильно, не пойму. Только не посылайте далеко, только учу ООП.
 
 Top
EuGen Администратор
Отправлено: 17 Апреля, 2013 - 17:08:18
Post Id


Профессионал


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


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




Ejik пишет:
$this->rev[] = (array_reverse($this->alist));

- по какой-то причине Вы добавляете перевернутый список как элемент массива. Естественно, что у массива нет методов класса, которые Вы от него ожидаете.
Подозреваю, что достаточно переопределить метод так:
PHP:
скопировать код в буфер обмена
  1. function view()
  2. {
  3.                 foreach(array_reverse($this->alist) as $article)
  4.                 {
  5.                         $article->view();
  6.                         echo '<hr />';
  7.                 }
  8. }


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Ejik
Отправлено: 17 Апреля, 2013 - 18:04:50
Post Id


Гость


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


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




EuGen, большое спасибо. Работает, хотя я особой разницы не вижу.
Давайте я прокоментирую свой код чтобы было видно из каких соображений он строился. Может и у кажете где, что я не правильно понял.
PHP:
скопировать код в буфер обмена
  1.  
  2. class ReversArticleList extends ArticleList // здесь понятно, наследуемый класс от ArticleList
  3. {
  4.         var $rev; // сюда будет сохранен перевернутый массив статей
  5.                
  6.         function add(Article $article)
  7.         {
  8.                 parent::add($article); // это наследуемый метод, который можно было здесь не писать, так как он полностью наследуется. Это я понял из вашего ответа :)
  9.         }
  10.        
  11.         function view()
  12.         {
  13.                 $this->rev[] = (array_reverse($this->alist)); // alist получаю из родительского класса ArticleList переворачиваю его и сохраняю в массив rev
  14.                 foreach($this->rev as $article) // вытаскиваю по одному элементу из массива
  15.                 {
  16.                         $article->view();
  17.                         echo '<hr />';
  18.                 }
  19.        
  20.         }
  21. }

как то так Улыбка
 
 Top
EuGen Администратор
Отправлено: 17 Апреля, 2013 - 19:55:59
Post Id


Профессионал


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


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




Ejik пишет:
$this->rev [] = (array_reverse($this->alist));

- здесь и ошибка


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Ejik
Отправлено: 18 Апреля, 2013 - 11:23:22
Post Id


Гость


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


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




EuGen, можно еще вопрос, нужно добавить в класс ArticleList метод, который будет удалять статью по ее id. Получить статью по ид получилось
PHP:
скопировать код в буфер обмена
  1. function del($id)
  2.         {      
  3.                 /*echo '<pre>';
  4.                 print_r($this->alist);
  5.                 echo '</pre>';  */
  6.                 foreach($this->alist as $article)
  7.                 {
  8.                 /*      echo '<pre>';
  9.                 print_r($article);
  10.                 echo '</pre>';*/
  11.                         if (($article->id) == $id)
  12.                                 //unset($article);
  13.                                
  14.                         $article->view();
  15.                 }
  16.         }
  17. }

а вот как удалить ее из списка не могу понять.
 
 Top
EuGen Администратор
Отправлено: 18 Апреля, 2013 - 11:32:16
Post Id


Профессионал


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


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




Можно, почему бы нет. Я бы даже порекомендовал удалять не просто по id, а, скажем, по списку id - так будет более гибко. Например:
PHP:
скопировать код в буфер обмена
  1. function del($mId)
  2. {
  3.    $rgIDs = is_array($mId)?$mId:array($mId);
  4.    $this->alist = array_filter($this->alist, function($rData) use ($rgIDs)
  5.    {
  6.       return !in_array($rData->id, $rgIDs);
  7.    });
  8. }


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Ejik
Отправлено: 18 Апреля, 2013 - 12:17:05
Post Id


Гость


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


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




EuGen пишет:
по списку id
не понял, что имеете ввиду под id списка?
Но и то что я только разбераюсь с ООП Ваш метод уж сильно наворочен, трудно сейчас понять что куда Улыбка
 
 Top
EuGen Администратор
Отправлено: 18 Апреля, 2013 - 12:19:41
Post Id


Профессионал


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


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




Ejik пишет:
не понял, что имеете ввиду под id списка?

Имеется ввиду, что можно удалить не только элемент с каким-то id, но и группу таких элементов. Как видно из метода, передаваться может как обычный id (тогда будет удалён только 1 элемент, если найдётся, разумеется), так и массив, содержащий id - тогда будут удалены все элементы с id из переданного списка. По поводу трудности понимания - достаточно вникнуть в описание array_filter и понять, что она делает.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Ejik
Отправлено: 18 Апреля, 2013 - 12:58:53
Post Id


Гость


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


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




в приведенном выше скрипте пхп ругается на syntax error, unexpected ')', expecting '{' in 4 строке
я из 7 строки ); перенес в конец 4 строки
PHP:
скопировать код в буфер обмена
  1. function del($mId)
  2.         {
  3.            $rgIDs = is_array($mId)?$mId:array($mId);
  4.            $this->alist = array_filter($this->alist, function($rData) use ($rgIDs));
  5.            {
  6.                   return !in_array($rData->id, $rgIDs);
  7.            }
  8.         }

вроде все правильно, почему он ругается?
и еще не понял function($rData) - что это за функция?
function($rData) use ($rgIDs) - и что это за конструкция, что она делает?
 
 Top
EuGen Администратор
Отправлено: 18 Апреля, 2013 - 13:02:49
Post Id


Профессионал


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


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




Приведённый выше код написан для PHP>=5.3
В коде используется замыкание. Почитать о них можете здесь


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Ejik
Отправлено: 18 Апреля, 2013 - 13:29:56
Post Id


Гость


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


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




EuGen, а как то по проще нельзя это сделать?
 
 Top
EuGen Администратор
Отправлено: 18 Апреля, 2013 - 13:37:30
Post Id


Профессионал


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


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




Это и есть - одно из самых простых и логичных, на мой взгляд, решений.
Но если есть такое нежелание изучить новое, то можно и циклом:
PHP:
скопировать код в буфер обмена
  1. public function del($id)
  2. {
  3.    foreach($this->alist as $iIndex=>$rItem)
  4.    {
  5.       if($rItem->id==$id)
  6.       {
  7.          unset($this->alist[$iIndex]);
  8.       }
  9.    }
  10. }


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Ejik
Отправлено: 18 Апреля, 2013 - 14:08:32
Post Id


Гость


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


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




EuGen, спасибо!!!!
EuGen пишет:
Но если есть такое нежелание изучить новое

Желания пока понять что как работает, пока легче читать и понять ваш второй вариант.
Но с практикой буду улучшать и применять новые фишки.
 
 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