Alterou o object após armazenamento ou object-estado usado

Exemplo:

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

E se eu adicionar um usuário ao armazenamento do usuário e depois mudar esse object de usuário? Neste caso, você pode argumentar que os objects do usuário somente devem ser armazenados em __destruct. Mas às vezes isso não é uma opção (por exemplo, imagine que o usuário seja exibido e atualizado depois).

Eu concordo com Peter, o modelo acima parece um pouco peculiar para mim e eu recomendaria contra salvaguardas implícitas no armazenamento de dados.

Além disso, um padrão para usar é algo como:

 class UserStorage { $_user; function addUser(User user, commit = true) { if (commit) { // save to db } else { // populate your internal instance $_user = user; } } } 

Portanto, se você tiver várias atualizações de um object Usuário na execução do seu aplicativo PHP, você pode usar

 addUser(user,false) 

Todo o caminho até a última chamada para

 addUser(user) 

Isso aliviará a necessidade de múltiplas inserções / atualizações para o database.

No entanto, o problema de onde na aplicação decidir finalmente salvar a db permanece, e é mais sobre stream lógico do que a representação de object. Pode ser útil ter uma function final () no script que persiste todos os seus objects para o db.

As gravações implícitas no database provavelmente são uma má idéia. Essa deve ser uma operação explícita e controlada.

Seu padrão é um pouco estranho para mim, mas acho que isso é como você gostaria de fazê-lo

 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(); } 

Mas Pessoalmente, eu não sou louco por esse design de class. Existem alguns padrões bem estabelecidos para isso que são menos confusos, como o ActiveRecord .