0

例子:

class UserStorage {
    public function addUser(User $user) { //saves to db }
}

class User {
    public function setName($name);
}

如果我将用户添加到用户存储并稍后更改该用户对象怎么办?在这种情况下,您可能会争辩说,用户对象应该只存储在 __destruct 上。但有时这不是一个选项(例如,想象用户在之后显示和更新)。

4

2 回答 2

1

我同意彼得的观点,上面的模型对我来说似乎有点古怪,我建议不要将隐式保存到数据存储区。

此外,要使用的模式类似于:

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() 函数将所有对象保存到数据库中可能会有所帮助。

于 2009-10-16T21:14:31.653 回答
1

隐式写入数据库可能是个坏主意。这应该是一个明确的、受控的操作。

你的模式对我来说有点奇怪,但我认为这是你想要做的

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

于 2009-10-16T20:30:47.257 回答