|
|
|
| Есть новостной скрипт.
Я решил сделать через ООП. Значит так:
class News
{
var news_id; //номер новости
var poster; //автор
var date; //дата
var title; //название
var newstext; //собственно текст
var comments; //количесство комментариев, 0 - их нет
var redacted; //boolean: редактировалась ли новость
method1() //...
}
|
Поверхностно ознакомившись с наследованием и полиморфизмом php, я решил сделать несколько дочерних классов.
К слову сказать, это я взялся переписывать по новой свой старый скрипт для того, чтобы можно было впоследствии добавлять новые возможности.
Объясню:
class Comments extends News
{
var comment_poster; //автор комментария
var comment_date; //дата публикации
var comment_text; //текст
method2() //...
}
class Redacted extends News
{
var redacted_poster; //автор комментария
var redacted_date; //дата публикации
method3() //...
}
|
То есть на данном этапе в скрипте можно добавить комментарий и оставить отметку о редактуре(администратор). А вдруг потом я захочу добавить форму прикрепления файлов к новости? Или еще что?
Теперь, суть проблемы.
Заполнение классов мне не видится сложным - здесь я создам новость, по мере появления комментариев и вдруг возникновения изменений дополняются соответствующие таблицы. Кстати да, я использую три таблицы:
news_text: news_id | poster | date | title | newstext | comments | redacted
news_comments: news_id | comment_id | poster | date | newstext
news_redact: news_id | poster | date
|
Пока все ясно?
Проблема видится в следующем:
Если я буду удалять новость, придется удалять и все остальное.
А вот как бы мне все это поэлегантнее устроить? Чтобы одной функцией - и ррраз!
В ходе логических рассуждений я пришел к мысли, что неплохо бы обращаться к методам дочерних функций из parent. Это вообще возможно? | |
|
|
|
|
|
|
|
для: neudor
(13.01.2006 в 19:43)
| | А почему не реализовать Observer, т.е. в каждом классе сделать свой метод delete(), все эти объекты собрать в классе Observer-а, в котором будет метод delete(), который будет foreach-ить собранные объекты и вызывать в них метод delete()? | |
|
|
|
|
|
|
|
для: isset
(13.01.2006 в 20:24)
| | Я решил сделать так:
news_main: news_id | comments| redacted
news_text: news_id | poster | date | title | newstext
news_comments: news_id | comment_id | poster | date | comment_text
news_redact: news_id | poster | date
|
Это были таблицы.
И создать для каждой свой класс. News_main будет родительским, остальные дочерними. И потом я легко добавлю еще возможности, например загрузку файлов:
news_upload: news_id | file| size | downloads
|
И немножко изменю методы родительского.
-->который будет foreach-ить собранные объекты
Это как? То есть через php можно узнать имена дочерних классов? Или если нет, то как к ним можно обратиться: через имя класса (class Comments) или через название объекта (comment = new Comments)? | |
|
|
|
|
|
|
|
для: neudor
(14.01.2006 в 12:41)
| | примерно так
<?php
class news_main {
function delete($id) {
$this->db->query('DELETE .... FROM news');
}
}
class news_comments {
function delete($id) {
$this->db->query('DELETE .... FROM news_comments');
}
}
class news {
var $news_items = array();
function news() {
$args = func_get_args();
foreach ($args as &$object) {
$this->news_items[] = $object;
}
}
function delete($id) {
foreach($this->news_items as $item) {
$item->delete($id);
}
}
}
$news = new news(new news_main, new news_comments);
?>
|
| |
|
|
|
|
|
|
|
для: isset
(14.01.2006 в 13:11)
| | ВАУ!
Я даже и не думал о таком решении. Спасибо.
Вечером попробую и отпишу. | |
|
|
|