2014-10-21 4 views
1

Я думаю, что приведенный ниже код работает отлично (я занят изучением OOP PHP и еще не тестировал этот код), если я хочу получить одну запись. Что делать, если я хочу зацикливать запись? Как это сделать ? Могу ли я использовать один класс для получения одиночной записи и записи цикла? Если да, то как?PHP OOP practice

include('class.database.php'); 
class News 
{ 
    protected $id; 
    protected $title; 
    protected $detail; 
    protected $updatedon; 
    protected $views; 
    protected $pic; 
    protected $cat; 
    protected $reporter; 

    function __construct ($id); 
     $newsdb = new Database; 
     $Query = "SELECT * FROM news WHERE nws_sn =".$id; 
     $db->query($Query); 
     $db->singleRecord(); 
     $this->id = $newsdb->Record['nws_sn']; 
     $this->title = $newsdb->Record['nws_title']; 
     $this->detail = $newsdb->Record['nws_detail']; 
     $this->updatedon = $newsdb->Record['nws_time']; 
     $this->views = $newsdb->Record['nws_view']; 
     $this->pic = $newsdb->Record['nws_pic']; 
     $this->cat = $newsdb->Record['nws_cat_id']; 
     $this->reporter = $newsdb->Record['nws_rptr_id'] 
    } 
    function getId() { 
     return $this->id; 
    } 
    function getTitle() { 
     return $this->title; 
    } 
    function getDetail() { 
     return $this->detail; 
    } 
    function getViews() { 
     return $this->views; 
    } 
    function getImage() { 
     return $this->pic; 
    } 
    function getTime() { 
     return $this->updatedon; 
    } 
} 
+0

Вы, кажется, на правильном пути. Обычно я создаю класс для представления ресурса, а другой класс представляет совокупность ресурсов. Это класс коллекции, который выполняет цикл и итерацию ресурса. –

+1

При использовании ключевого слова 'new' в конструкторе вы не выполняете ООП. – PeeHaa

+0

^Да, лучше передать экземпляр типа «База данных» на ваш объект, а не делать это – DarkBee

ответ

1

Вы хотите использовать конструктор для инициализации внутреннего состояния вашего объекта. В вашем случае вы делаете слишком много в своем конструкторе, который также нарушает принцип «единой ответственности». Похоже, что «Новости» - это объект или объект передачи данных, поэтому вы должны инициализировать его извне.

Во-первых, я буду хранить новости только для хранения информации, полученной из базы данных.

Во-вторых, я бы создал статический метод фабрики внутри класса News, чтобы создать фактический объект новостей и заполнить его данными, переданными методу извне. Кроме того, вы можете создать фабричный объект для создания своей сущности, но поскольку логика построения достаточно проста, я подумал, что имеет смысл держать ее внутри одного метода.

Рассмотрим код ниже:

class News 
{ 
    protected $id; 
    protected $title; 
    protected $detail; 
    protected $updatedon; 
    protected $views; 
    protected $pic; 
    protected $cat; 
    protected $reporter; 

    public static createFromRecord($record) 
    { 
     $obj = new self(); 

     $obj->setId($record->Record['nws_sn']); 
     $obj->setTitle($record->Record['nws_title']); 
     $obj->setDetail($record->Record['nws_detail']); 
     $obj->setUpdateon($record->Record['nws_time']); 
     $obj->setViews($record->Record['nws_view']); 
     $obj->setPic($record->Record['nws_pic']); 
     $obj->setCat($record->Record['nws_cat_id']); 
     $obj->setReporter($record->Record['nws_rptr_id']); 

     return $obj; 
    } 

    function getId() { 
     return $this->id; 
    } 

    function getTitle() { 
     return $this->title; 
    } 
    function getDetail() { 
     return $this->detail; 
    } 
    function getViews() { 
     return $this->views; 
    } 
    function getImage() { 
     return $this->pic; 
    } 
    function getTime() { 
     return $this->updatedon; 
    } 

    // ... add public setters for the properties 
} 

... 

$newsdb = new Database; 
$Query = "SELECT * FROM news WHERE nws_sn =".$id; 
$db->query($Query); 
$record = $db->singleRecord(); 

$newsObject = News::createFromRecord($record);