То, что вы пытаетесь заархивировать, это функционально ORM (Object-Relational-Mapper).Может быть полезно использовать один, а не делать это самостоятельно.
Если вы хотите сделать это самостоятельно, я бы пошел на ленивую загрузку.Это немного между твоими двумя идеями.В PHP это выглядит примерно так:
class User
{
private $id; // depends on your application, could also be a string
private $dirty;
private $loaded;
private $properties;
public function __construct($user_id)
{
$this->id = $user_id;
}
public function __destruct()
{
if ($this->dirty) {
// commit to DB
}
}
public function __get($name)
{
if (!$loaded)
{
$this->loadFromDb();
}
// error-handling if the key does not exist is missing here!
return $this->properties[$name];
}
public function __set($name, $value)
{
// May be required to load the data here...
// error-handling if the key does not exist is missing here!
$properties[$name] = $value;
$this->dirty = true;
}
private function loadFromDb()
{
// query data from db and store it in properties
}
}
Преимущество этого дизайна в том, что если вы создаете объекты, которые в конечном итоге вам не нужны, ничто еще не коснулось базы данных.Также обратите внимание на фиксацию, выполненную во время деконструкции.
Если вы загружаете коллекции, иногда бывает полезно, чтобы функция загружала набор строк из БД и передавала строки в качестве аргумента конструктору при создании объектов.Для этого потребуется только один запрос вместо сотен, если бы вы построили каждый объект отдельно.
В качестве дополнительного улучшения вы можете предоставить функцию User::reset()
, которая отбрасывает все сделанные изменения.