Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нюансы с классами
 
 автор: neudor   (13.01.2006 в 19:43)   письмо автору
 
 

Есть новостной скрипт.
Я решил сделать через ООП. Значит так:

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. Это вообще возможно?

   
 
 автор: isset   (13.01.2006 в 20:24)   письмо автору
 
   для: neudor   (13.01.2006 в 19:43)
 

А почему не реализовать Observer, т.е. в каждом классе сделать свой метод delete(), все эти объекты собрать в классе Observer-а, в котором будет метод delete(), который будет foreach-ить собранные объекты и вызывать в них метод delete()?

   
 
 автор: neudor   (14.01.2006 в 12:41)   письмо автору
 
   для: 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)?

   
 
 автор: isset   (14.01.2006 в 13:11)   письмо автору
 
   для: 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);
?>

   
 
 автор: neudor   (14.01.2006 в 13:18)   письмо автору
 
   для: isset   (14.01.2006 в 13:11)
 

ВАУ!
Я даже и не думал о таком решении. Спасибо.

Вечером попробую и отпишу.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования