Если взять еще удаление, то news::delete(); пожалуй, грамотней чем $news->delete();
Но вообще я не об этом. Допустим, у вас есть новости в БД. Тогда (примитивный пример):
class news
{
private $id;
private $title;
private $date;
private $text;
public function __construct($id)
{
$this->id = $id;
$result = mysql_query('SELECT `title`, `date`, `text` FROM `news_table` WHERE `id`="'.$this->id.'" LIMIT 1');
$row = mysql_fetch_assoc($result);
$this->title = $row['title'];
$this->date = $row['date'];
$this->text = $row['text'];
}
public function get_new()
{
return array (
'id' => $this->id,
'title' => $this->title,
'date' => $this->date,
'text' => $this->text
);
}
public function edit_new($title, $date, $text)
{
$this->title = $title;
$this->date = $date;
$this->text = $text;
mysql_query ('UPDATE `news_table` SET `title`="'.$title.'", `date`="'.$this->date.'", `text`="'.$this->text.'" WHERE `id`="'.$this->id.'" LIMIT 1');
return true;
}
}
Грубо говоря, все свойства хранятся в обьекте; мы можем получать/изменять их в зависимости от наших нужд, при это нужно было всего лишь передать в конструктор id новости. Все! ИМХО, это намного удобнее, чем писать на каждое действие по функции и тягать массив с данными.
Если же сделать немного более абстрактно, то можно получить вообще что-то на подобии:
class news
{
private $id;
private $properties = array();
public function __construct($id)
{
$this->id = $id;
$result = mysql_query('SELECT * FROM `news_table` WHERE `id`="'.$this->id.'" LIMIT 1');
$row = mysql_fetch_assoc($result);
foreach ($row as $key=>$value)
$this->properties[$key] = $value;
}
public function get_property($name)
{
if (isset($this->properties[$name]))
return $this->properties[$name];
return false;
}
public function set_property($name, $value)
{
if (isset($this->properties[$name])) {
$this->properties[$name] = $value;
return true;
}
return false;
}
}
А запрос с UPDATE можно вообще засунуть в деструктор :) Вы можете представить себе подобное при использовании функционального подхода?
Да, можно таскать все данные по элементу в массиве и написать те же самые функции. Но вот это уже как раз… не знаю даже как сказать, неестественно, что ли. По-моему, правильней рассмаривать новость, как обьект, обладающий свойствами, а не как массив данных. Вот вы говорили про несоответствие реального и программного мира — в реальном мире у вас есть, например, рубашка, обладающая свойствами — цвет, тип ткани, размер, количество пуговиц. Но рубашка это именно обьект, а не просто набор этих данных. То же самое и здесь.
Зачем ей знать как добавлять себя в БД? Или отрисовывать себя в X окнах или консольных терминалах.
На счет БД — вопрос спорный. На счет отрисовки — ей однозначно не нужно этого «знать». Отрисовка — это уже вью-логика, которая сюда никак не лезет. Но ведь обьект и не содержит html-кода, только данные.