Пример A обновляет базу данных всякий раз, когда вызывается setName
. Эта функция выглядит как простой метод записи, но при вызове выполняет дорогостоящие действия (подключение к базе данных, выполнение запроса и т. Д.). Эти непреднамеренные эффекты сайта делают Пример B более привлекательным.
В качестве дополнительного примера: позже вам может понадобиться класс Validator, который проверяет запись и гарантирует, что запись находится в допустимом состоянии. Но для того, чтобы изучить запись, вы должны сначала определить ее, задав имя - чтобы запись сохранялась до того, как вы сможете проверить ее состояние. Определение состояния объекта не совпадает с постоянным состоянием объекта.
Подход модели данных может работать лучше, чем подход, основанный на записях. Например:
class Model {
protected $_props= array();
public $changed= false;
static public $models= array();
function __set($name, $value) {
$this->changed= true;
$this->_props[$name]= $value;
}
function __construct() {
Model::$models[]= $this;
}
public function save() {
// Execute database query for saving the current Model
}
static public function update() {
foreach (Model::$models as $model) {
if ($model->changed) {
$model->save();
}
}
}
}
Основанное на модели решение действительно хорошо подходит для создания различных типов моделей. Например:
class Person extends Model {
public function save() {
// Execute person-specific write operations
}
}
class Doctor extends Person {
public function save() {
// Execute all Person write operations
parent::save();
// Save the extra bits that belong to a doctor
}
}
$person1= new Person();
$person->firstname= 'Jon';
$person->lastname= 'Skeet';
$doctor1= new Doctor();
$doctor1->firstname= 'House';
$doctor1->lastname= 'MD';
// Save all modified models
Model::update();
Хотя я редко нахожу применение для таких механизмов массового обновления. Условия записи обычно более конкретны.