Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数据库实体对象模型——松散表示与严格表示?_Php_Database_Api_Oop - Fatal编程技术网

Php 数据库实体对象模型——松散表示与严格表示?

Php 数据库实体对象模型——松散表示与严格表示?,php,database,api,oop,Php,Database,Api,Oop,当我正在编写一些PHP API时,我正试图解决这个难题。我正在尽我最大的努力编写一些可靠的API,而不是一个PHP老手,在黑暗中摸索,希望找到一些最佳实践。我也不确定我是否使用了正确的术语,所以请纠正我 我有一些实体将它们的数据存储在数据库中,我正在以面向对象的方式进行建模。我的模型是否应该始终严格地表示数据库中当前的内容 松散数据库表示 用户可以自由更改模型的属性,然后将任何更改保存到数据库中 模型并不总是反映数据库中的内容,因为用户可以任意更改模型 严格的数据库表示 用户

当我正在编写一些PHP API时,我正试图解决这个难题。我正在尽我最大的努力编写一些可靠的API,而不是一个PHP老手,在黑暗中摸索,希望找到一些最佳实践。我也不确定我是否使用了正确的术语,所以请纠正我

我有一些实体将它们的数据存储在数据库中,我正在以面向对象的方式进行建模。我的模型是否应该始终严格地表示数据库中当前的内容



松散数据库表示
  • 用户可以自由更改模型的属性,然后将任何更改保存到数据库中
  • 模型并不总是反映数据库中的内容,因为用户可以任意更改模型





严格的数据库表示
  • 用户无法自由更改模型的属性。只为属性提供了getter(没有setter)
  • 该模型保证始终表示数据库中的内容
  • 更改模型的唯一方法是同时更改数据库中的内容



您喜欢使用哪种API样式?

我从松散模型开始,开始怀疑严格模型是否是一种更好的方法?严格模型对完整性的承诺是否超过了松散模型的灵活性


我愿意接受任何想法、评论、赞成/反对、备选方案和想法;我只想正确地使用PHP,并制作一个其他程序员满意的好API:)

这两个示例都让我想起了ActiveRecord模式。ActiveRecord是指您为对象赋予CRUD方法,也就是说,它们知道如何从数据源中创建、读取、更新和删除自己

现在,如果我理解正确的话,您可能想知道是否最好能够设置模型的属性,然后对其调用CRUD方法,或者直接调用CRUD方法,传入在内部设置属性的参数?在这两种情况下,似乎两种“表述”都和另一种一样松散或严格。就一个好的API而言,我认为“松散”的表示形式将是大多数人所期望的

现在,我们来谈谈建议。与数据源交互有两种流行的模式。一个是ActiveRecord模式,另一个是Repository模式。我简要描述了ActiveRecord模式。Repository模式从模型中剥离出数据交互责任,并将其放入“Repository”类中。此存储库类负责CRUD操作。关于ActiveRecordV的利弊,有很多帖子。存储库模式,所以您可以查找它。我要说的是,存储库模式被更广泛地接受为“更好”的模式

当您说“用户可以自由更改模型的属性,然后稍后将任何更改保存到数据库中”时,请参考:一般来说,对象应该保护其不变量。也就是说,您不应该允许他们的数据被设置为无效状态。一个对象应该用它所需要的信息来构造,并且不提供setter,除非改变对象中的值是有意义的。即使这样,您也可以给setter一个比setX()更好的名称。ei:汽车对象上的fillUp()而不是setFuel()

我个人会使用存储库模式进行设计:

class SnippetRepository
  void save(Snippet snippet) { ... }
  void update(Snippet snippet) { ... }
  boolean delete(Snippet snippet) { ... }
  Snippet load(SnippetId id) { ... }
end

$snippet = (new Snippet)
    ->label("grapes")
    ->content("wine");
snippetRepository.save($snippet);

我希望这能有所帮助。

非常感谢您的建议,您真的让我回到了绘图板,开始研究ActiveRecord和存储库模式!
<?php

  // Write a snippet
$snippet = (new Snippet)->write("grapes", "wine");

  // Load a snippet
$snippet = (new Snippet)->read("bananas");

  // Update an existing snippet
$snippet->update("potassium");

?>
class SnippetRepository
  void save(Snippet snippet) { ... }
  void update(Snippet snippet) { ... }
  boolean delete(Snippet snippet) { ... }
  Snippet load(SnippetId id) { ... }
end

$snippet = (new Snippet)
    ->label("grapes")
    ->content("wine");
snippetRepository.save($snippet);