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]   

> Без описания
Fedak.o.b
Отправлено: 13 Октября, 2011 - 12:03:27
Post Id



Новичок


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


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




Добрый день!
Вот недавно начал изучать ОО, и еще не очень все понимаю как реализовать.

Для начал чтоб проверить как усвоился материал параллельно делал новостную ленту.
Так вот, меньше слов больше к теме вопроса.

Вот сам мой пример):

news.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. include "config.php";
  4.  
  5. class News
  6. {
  7.     public $idnews; // Індитифікатор новини
  8.     public $idrybruka; // Індитифікатор рубрики
  9.     public $iduser; // Індитифікатор автора
  10.     public $title; // Заголовок
  11.     public $text; // Текст
  12.     public $date; // Дата private
  13.    
  14.     function __construct($idnews, $idrybruka, $iduser, $title, $text, $date)
  15.     {
  16.         $this->idnews = $idnews;
  17.         $this->idrybruka = $idrybruka;
  18.         $this->iduser = $iduser;
  19.         $this->title = $title;
  20.         $this->text = $text;
  21.         $this->date = $date;
  22.     }
  23. }
  24.  
  25. class NewsBD
  26. {
  27.     private $outPut;
  28.    
  29.     function __construct()
  30.     {
  31.         $this->outPut = array();
  32.     }
  33.  
  34.     function Select($news_id = False)
  35.     {
  36.         $sql = "SELECT `idnews`, `idrybruka`, `iduser`, `title`, `min_text`, `max_text`, `date` FROM `news` WHERE `active`='1'";
  37.         ($news_id) ? $sql.= "AND `idnews`='{$news_id}'" : $sql.= "ORDER BY `idnews` DESC";
  38.        
  39.         $query = mysql_query($sql);
  40.         while($row = @mysql_fetch_array($query))
  41.         {
  42.             ($news_id) ? $opus = $row['max_text'] : $opus = $row['min_text'];
  43.            
  44.             $outPut[] = new News($row['idnews'], $row['idrybruka'], $row['iduser'], $row['title'], $opus, $row['date']);
  45.         }
  46.         return $outPut;
  47.     }
  48. }
  49.  
  50. ?>
  51.  


index.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. require_once "includes/functions.php";
  4. require_once "includes/News.php";
  5.  
  6. // Створуємо об'єкт Новини
  7. $obj = new NewsBD();
  8.  
  9. $news_id = (int)$_GET['id'];
  10. $news = $obj->Select($news_id);
  11. echo (empty($news)) ? "(новини не існує)" : false;
  12.  
  13. for($i=0; $i<count($news); $i++)
  14. {
  15.     echo
  16.     "<strong>{$news[$i]->title}</strong><br>",
  17.     "{$news[$i]->text}<br>",
  18.     "<code>Дата: {$news[$i]->date}</code><br>",
  19.     "<a href=\"".(empty($news_id) ? "index.php?id={$news[$i]->idnews}" : redirect())."\">".(empty($news_id) ? "Детальніше" : "Назад")."</a><hr>";
  20. }
  21.  
  22. ?>
  23.  


Вопрос:
1. В файле News.php в классе NewsBD, создаем объект News, и соответствующими параметрами, вопрос состоит в том рентабельно ли создавать объект в цикле while, или лутше создание объекта News, в классе NewsBD перед циклом while, и переписать класс так чтоб каждое свойство имело свой метод, и обращаться уже не к объекту, а к его методам.

2. И еще, правильно ли я написал дизайн кода по отношнию к паттерн(ООП).

Зарание спасибо!

(Отредактировано автором: 13 Октября, 2011 - 13:26:00)

 
 Top
OrmaJever Модератор
Отправлено: 13 Октября, 2011 - 13:09:14
Post Id



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


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


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




Fedak.o.b пишет:
рентабельно ли создавать объект в цикле For, или лутше создание объекта News, в классе NewsBD перед циклом For

нет, лутше создать объект перед цыклом.
И в классе newsDB у вас есть ошибочка
Здесь вы инстализируете масив правельно
PHP:
скопировать код в буфер обмена
  1.     function __construct()
  2.     {
  3.         $this->outPut = array();
  4.     }

А вот тут уже совсем другая переменая


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Fedak.o.b
Отправлено: 13 Октября, 2011 - 13:34:21
Post Id



Новичок


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


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




Я убрал совсем __construct в класе News?,
создал метод outputNews():

PHP:
скопировать код в буфер обмена
  1.         function outputNews($idnews, $idrybruka, $iduser, $title, $text, $date)
  2.         {
  3.                 $this->idnews = $idnews;
  4.                 $this->idrybruka = $idrybruka;
  5.                 $this->iduser = $iduser;
  6.                 $this->title = $title;
  7.                 $this->text = $text;
  8.                 $this->date = $date;
  9.         }


Создание объека винес за цикл:

потом обращаюся к методу созданого объекта уже в цикле
PHP:
скопировать код в буфер обмена
  1. $outPut[] = $obj->outputNews($row['idnews'], $row['idrybruka'], $row['iduser'], $row['title'], $opus, $row['date']);

и на выходе ничего не получаю, почему?
 
 Top
JohnnyB
Отправлено: 13 Октября, 2011 - 15:01:56
Post Id


Новичок


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


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




Потому что ты в функции ничего не возвращаешь чтоб в массив записывать, делай так тогда уж
PHP:
скопировать код в буфер обмена
  1.  
  2. $obj->outputNews($row['idnews'], $row['idrybruka'], $row['iduser'], $row['title'], $opus, $row['date']);
  3. $outPut[] = $this->idnews;
  4. .......
  5. $outPut[] = $this->date;
  6.  

или в функции outputNews() в массив запиливай а потом через return возвращай.
 
 Top
Fedak.o.b
Отправлено: 13 Октября, 2011 - 15:35:12
Post Id



Новичок


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


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




твой первый вариант не подошел, второй не я понял)
 
 Top
JohnnyB
Отправлено: 14 Октября, 2011 - 08:35:49
Post Id


Новичок


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


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




PHP:
скопировать код в буфер обмена
  1.  
  2. function outputNews($idnews, $idrybruka, $iduser, $title, $text, $date)
  3.         {
  4.                $arr = array();
  5.                $arr[] = $idnews;
  6.                $arr[] = $idrybruka;
  7.                $arr[] = $iduser;
  8.                $arr[] = $title;
  9.                $arr[] = $text;
  10.                $arr[] = $date;
  11.                return $arr;
  12.         }

потом уже
PHP:
скопировать код в буфер обмена
  1.  
  2.  $obj = new News();
  3.  $outPut = $obj->outputNews($row['idnews'], $row['idrybruka'], $row['iduser'], $row['title'], $opus, $row['date']);
  4.  
 
 Top
zdlr
Отправлено: 18 Октября, 2011 - 23:16:52
Post Id


Новичок


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


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




Как по мне вообще непонятно. Почему не написать один класс на все?

Примерно так.

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. class News{
  4.    
  5.         public $outPut;
  6.    
  7.     public function __construct(){
  8.                  $this->outPut = array();
  9.     }
  10.        
  11.         public function Select($news_id = FALSE){
  12.         $sql = "SELECT ...";
  13.         $query = mysql_query($sql);
  14.                
  15.         if($result) while ($row = mysql_fetch_array($result)){
  16.            
  17.             $news = array(
  18.                                 "idnews" => $row['idnews'],
  19.                                 "idrybruka" => $row['idrybruka'],
  20.                                 "iduser" => $row['iduser'],
  21.                                 "title" => $row['title'],
  22.                                 "text" => ($news_id?$row['max_text']:$row['min_text']),
  23.                                 "date" => $row['date']
  24.                         );
  25.                        
  26.                         array_push($this->outPut, $news);
  27.         } else return FALSE;
  28.                 return TRUE;
  29.     }
  30.        
  31.         public function ShowMeMyNews($news_id){
  32.                 if($this->Select($news_id)){
  33.                         $str = "";
  34.                         foreach($this->outPut as $news):
  35.                                 $str .= $this->newsBlock($news);
  36.                         endforeach;
  37.                        
  38.                         echo $str;
  39.                 } else {
  40.                         echo "(новини не існує)";
  41.                 }
  42.         }
  43.        
  44.         public function newsBlock($data){
  45.                 $str = "<strong>{$data['title']}</strong>";
  46.                 $str .= "<strong>{$data['idrybruka']}/{$data['iduser']}</strong>";
  47.                 $str .= "<a href=\"?news={$data['idnews']}\">{$data['idrybruka']}</a>";
  48.                 $str .= "<div>{$data['text']}</div>";
  49.                 $str .= "<strong>{$data['date']}</strong>";
  50.                
  51.                 return $str;
  52.         }
  53.        
  54. }
  55.  
  56.  


И потом в вашем индексе дергать так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $news = new News();
  3. $news->ShowMeMyNews(1);
  4.  



Так же легче в сто раз. Вообще непонимаю зачем вам 2 класса.

(Отредактировано автором: 18 Октября, 2011 - 23:18:12)

 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Октября, 2011 - 00:02:44
Post Id



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


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


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




zdlr пишет:
$sql = "SELECT ...";
$query = mysql_query($sql);

Ще бы вот это сразу в класс для DB вынести, к нему и обращаться.
 
 Top
White
Отправлено: 19 Октября, 2011 - 00:16:46
Post Id



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


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


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




можно ради удобства хотя бы Table Data Gateway использовать и класс для БД в качестве адаптера.


-----
if(time()>1356048000) die();
 
 Top
zdlr
Отправлено: 19 Октября, 2011 - 00:22:42
Post Id


Новичок


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


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




DeepVarvar пишет:
zdlr пишет:
$sql = "SELECT ...";
$query = mysql_query($sql);

Ще бы вот это сразу в класс для DB вынести, к нему и обращаться.


Да это я чтоб парню не усложнять то что у него есть. А то у него голова задымится. Пусть разберется как такое может работать. Конечно писать запросы руками не нужно, это одолжно делать чтото иное и автоматически.
 
 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