PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Без описания
Поиск в теме | Версия для печати
Fedak.o.b
Отправлено: 13 Октября, 2011 - 12:03:27
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Окт. 2011
Помог: 0 раз(а)
Добрый день!
Вот недавно начал изучать ОО, и еще не очень все понимаю как реализовать.
Для начал чтоб проверить как усвоился материал параллельно делал новостную ленту.
Так вот, меньше слов больше к теме вопроса.
Вот сам мой пример):
news.php
PHP:
скопировать код в буфер обмена
<?PHP
include "config.php" ;
class News
{
public $idnews ; // Індитифікатор новини
public $idrybruka ; // Індитифікатор рубрики
public $iduser ; // Індитифікатор автора
public $title ; // Заголовок
public $text ; // Текст
public $date ; // Дата private
function __construct( $idnews , $idrybruka , $iduser , $title , $text , $date )
{
$this -> idnews = $idnews ;
$this -> idrybruka = $idrybruka ;
$this -> iduser = $iduser ;
$this -> title = $title ;
$this -> text = $text ;
$this -> date = $date ;
}
}
class NewsBD
{
private $outPut ;
function __construct( )
{
}
function Select( $news_id = False )
{
$sql = "SELECT `idnews`, `idrybruka`, `iduser`, `title`, `min_text`, `max_text`, `date` FROM `news` WHERE `active`='1'" ;
( $news_id ) ? $sql .= "AND `idnews`='{$news_id} '" : $sql .= "ORDER BY `idnews` DESC" ;
{
( $news_id ) ? $opus = $row [ 'max_text' ] : $opus = $row [ 'min_text' ] ;
$outPut [ ] = new News( $row [ 'idnews' ] , $row [ 'idrybruka' ] , $row [ 'iduser' ] , $row [ 'title' ] , $opus , $row [ 'date' ] ) ;
}
return $outPut ;
}
}
?>
index.php
PHP:
скопировать код в буфер обмена
<?PHP
require_once "includes/functions.php" ;
require_once "includes/News.php" ;
// Створуємо об'єкт Новини
$obj = new NewsBD( ) ;
$news_id = ( int) $_GET [ 'id' ] ;
$news = $obj -> Select ( $news_id ) ;
echo ( empty ( $news ) ) ?
"(новини не існує)" : false ;
for ( $i = 0 ; $i < count( $news ) ; $i ++ )
{
echo
"<strong>{$news [$i ]->title}</strong><br>" ,
"{$news [$i ]->text}<br>" ,
"<code>Дата: {$news [$i ]->date}</code><br>" ,
"<a href=\" " . ( empty ( $news_id ) ?
"index.php?id={$news [$i ]->idnews}" : redirect
( ) ) . "\" >" . ( empty ( $news_id ) ?
"Детальніше" : "Назад" ) . "</a><hr>" ; }
?>
Вопрос:
1. В файле News.php в классе NewsBD , создаем объект News , и соответствующими параметрами, вопрос состоит в том рентабельно ли создавать объект в цикле while, или лутше создание объекта News , в классе NewsBD перед циклом while, и переписать класс так чтоб каждое свойство имело свой метод, и обращаться уже не к объекту, а к его методам.
2. И еще, правильно ли я написал дизайн кода по отношнию к паттерн(ООП).
Зарание спасибо!(Отредактировано автором: 13 Октября, 2011 - 13:26:00)
OrmaJever
Отправлено: 13 Октября, 2011 - 13:09:14
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010
Откуда: Чернигов
Помог: 299 раз(а)
Fedak.o.b пишет: рентабельно ли создавать объект в цикле For, или лутше создание объекта News, в классе NewsBD перед циклом For
нет, лутше создать объект перед цыклом.
И в классе
newsDB у вас есть ошибочка
Здесь вы инстализируете масив правельно
А вот тут уже совсем другая переменая
-----Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Fedak.o.b
Отправлено: 13 Октября, 2011 - 13:34:21
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Окт. 2011
Помог: 0 раз(а)
Я убрал совсем
__construct в класе
News ?,
создал метод
outputNews() :
PHP:
скопировать код в буфер обмена
function outputNews( $idnews , $idrybruka , $iduser , $title , $text , $date )
{
$this -> idnews = $idnews ;
$this -> idrybruka = $idrybruka ;
$this -> iduser = $iduser ;
$this -> title = $title ;
$this -> text = $text ;
$this -> date = $date ;
}
Создание объека винес за цикл:
потом обращаюся к методу созданого объекта уже в цикле
PHP:
скопировать код в буфер обмена
$outPut [ ] = $obj -> outputNews ( $row [ 'idnews' ] , $row [ 'idrybruka' ] , $row [ 'iduser' ] , $row [ 'title' ] , $opus , $row [ 'date' ] ) ;
и на выходе ничего не получаю, почему?
JohnnyB
Отправлено: 13 Октября, 2011 - 15:01:56
Новичок
Покинул форум
Сообщений всего: 49
Дата рег-ции: Сент. 2011
Помог: 2 раз(а)
Потому что ты в функции ничего не возвращаешь чтоб в массив записывать, делай так тогда уж
PHP:
скопировать код в буфер обмена
$obj -> outputNews ( $row [ 'idnews' ] , $row [ 'idrybruka' ] , $row [ 'iduser' ] , $row [ 'title' ] , $opus , $row [ 'date' ] ) ;
$outPut [ ] = $this -> idnews ;
.......
$outPut [ ] = $this -> date ;
или в функции outputNews() в массив запиливай а потом через return возвращай.
JohnnyB
Отправлено: 14 Октября, 2011 - 08:35:49
Новичок
Покинул форум
Сообщений всего: 49
Дата рег-ции: Сент. 2011
Помог: 2 раз(а)
PHP:
скопировать код в буфер обмена
function outputNews( $idnews , $idrybruka , $iduser , $title , $text , $date )
{
$arr [ ] = $idnews ;
$arr [ ] = $idrybruka ;
$arr [ ] = $iduser ;
$arr [ ] = $title ;
$arr [ ] = $text ;
$arr [ ] = $date ;
return $arr ;
}
потом уже
PHP:
скопировать код в буфер обмена
$obj = new News( ) ;
$outPut = $obj -> outputNews ( $row [ 'idnews' ] , $row [ 'idrybruka' ] , $row [ 'iduser' ] , $row [ 'title' ] , $opus , $row [ 'date' ] ) ;
zdlr
Отправлено: 18 Октября, 2011 - 23:16:52
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Окт. 2011
Помог: 0 раз(а)
Как по мне вообще непонятно. Почему не написать один класс на все?
Примерно так.
PHP:
скопировать код в буфер обмена
class News{
public $outPut ;
public function __construct( ) {
}
public function Select( $news_id = FALSE ) {
$sql = "SELECT ..." ;
"idnews" => $row [ 'idnews' ] ,
"idrybruka" => $row [ 'idrybruka' ] ,
"iduser" => $row [ 'iduser' ] ,
"title" => $row [ 'title' ] ,
"text" => ( $news_id ?$row [ 'max_text' ] : $row [ 'min_text' ] ) ,
"date" => $row [ 'date' ]
) ;
} else return FALSE ;
return TRUE ;
}
public function ShowMeMyNews( $news_id ) {
if ( $this -> Select ( $news_id ) ) {
$str = "" ;
foreach ( $this -> outPut as $news ) :
$str .= $this -> newsBlock ( $news ) ;
endforeach ;
echo $str ;
} else {
echo "(новини не існує)" ;
}
}
public function newsBlock( $data ) {
$str = "<strong>{$data['title']} </strong>" ;
$str .= "<strong>{$data['idrybruka']} /{$data['iduser']} </strong>" ;
$str .= "<a href=\" ?news={$data['idnews']} \" >{$data['idrybruka']} </a>" ;
$str .= "<div>{$data['text']} </div>" ;
$str .= "<strong>{$data['date']} </strong>" ;
return $str ;
}
}
И потом в вашем индексе дергать так:
Так же легче в сто раз. Вообще непонимаю зачем вам 2 класса.(Отредактировано автором: 18 Октября, 2011 - 23:18:12)
zdlr
Отправлено: 19 Октября, 2011 - 00:22:42
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Окт. 2011
Помог: 0 раз(а)
DeepVarvar пишет: zdlr пишет: $sql = "SELECT ...";
$query = mysql_query($sql);
Ще бы вот это сразу в класс для DB вынести, к нему и обращаться.
Да это я чтоб парню не усложнять то что у него есть. А то у него голова задымится. Пусть разберется как такое может работать. Конечно писать запросы руками не нужно, это одолжно делать чтото иное и автоматически.
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB