例子:
class UserStorage {
public function addUser(User $user) { //saves to db }
}
class User {
public function setName($name);
}
如果我将用户添加到用户存储并稍后更改该用户对象怎么办?在这种情况下,您可能会争辩说,用户对象应该只存储在 __destruct 上。但有时这不是一个选项(例如,想象用户在之后显示和更新)。
我同意彼得的观点,上面的模型对我来说似乎有点古怪,我建议不要将隐式保存到数据存储区。
此外,要使用的模式类似于:
class UserStorage {
$_user;
function addUser(User user, commit = true) {
if (commit) {
// save to db
} else {
// populate your internal instance
$_user = user;
}
}
}
因此,如果您在执行 PHP 应用程序时对 User 对象进行了多次更新,则可以使用
addUser(user,false)
一直到最后一次调用
addUser(user)
这将减轻对数据库的多次插入/更新的需要。
但是,您在应用程序中决定最终保存到数据库的位置的问题仍然存在,并且更多的是关于逻辑流而不是对象表示。在脚本中使用 end() 函数将所有对象保存到数据库中可能会有所帮助。
隐式写入数据库可能是个坏主意。这应该是一个明确的、受控的操作。
你的模式对我来说有点奇怪,但我认为这是你想要做的
class UserStorage
{
const ACTION_INSERT = 'INSERT';
const ACTION_UPDATE = 'UDPATE';
public function addUser(User $user)
{
$this->saveUser($user, self::ACTION_INSERT);
}
public function updateUser(User $user)
{
$this->saveUser($user, self::ACTION_UPDATE);
}
protected function saveUser(User $user, $action)
{
switch ($action) {
case self::ACTION_INSERT:
// INSERT query
break;
case self::ACTION_UPDATE:
// UPDATE query
break;
default:
throw new Exception('Unsupported action');
}
}
}
class User
{
public function setName($name)
{
// whatever
}
}
$userStorage = new UserStorage();
$user = new User();
$userStorage->addUser($user);
$user->setName('Peter');
try {
$userStorage->updateUser($user);
} catch (Exception $e) {
echo "There was an error saving this user: " . $e->getMessage();
}
但就我个人而言,我对这个类的设计并不疯狂。有一些既定的模式不那么令人困惑,例如ActiveRecord。