CakePHP模型:为什么实例方法?

时间:2014-09-15 20:27:52

标签: php oop cakephp orm cakephp-appmodel

为什么所有CakePHP模型方法都是实例方法。例如:

$post = $this->Post->findById($id);

代替

$post = Post::find($id);

我认为所有适用于模型实例(或记录)的方法都是实例方法,例如:

$post = ...;
$post->publish(); // Would be $this->Post->publish($id) using Cake

并且创建或查找记录(对整个记录集合起作用)的所有方法都是类方法(实例方法),例如:

$post = Post::findById($id); // Would be $this->Post->findById($id) using Cake

$newPost = Post::create(['title' => 'My post', 'body' => '<p>...</p>']);
// Would be $newPost = $this->Post->create([...]); using Cake

我认为这种Cake约定与逻辑OOP约定相反。有谁知道这个设计的原因?

1 个答案:

答案 0 :(得分:2)

  • 静态调用或单例使得很难使用依赖注入,并且很难测试代码。你正在创建紧密耦合的代码 - 不好。你想要loose coupling
  • 当通过关联使用模型时,会创建一个新实例,这就是为什么存在模型的别名属性的原因。您可以将完全不同的行为绑定到它或以其他方式更改它的状态。
  • 您希望能够动态修改和重载属性和方法以及创建新实例。示例:具有同一个表的两个模型实例,但写入两个DB。对于使用数据库连接的应用程序,这种情况非常类似,具体取决于登录用户或vhost。
  • 您显然不想通过此扩展模型:Extending singletons in PHP
  

我认为这种Cake约定与逻辑OOP约定相反。   有谁知道这个设计的原因?

您所描述的不是合乎逻辑的,也不是良好的实践。好吧,你可以提供一些链接来解释为什么你认为这是&#34;逻辑OOP约定&#34;。除了design patterns之外没有任何约定。一个好的用例是&#34;实用程序&#34;类似于&#34;实用程序&#34;中的类。 CakePHP的文件夹。没有必要有多个实例。

请参阅以下问题和链接:

如果你想要&#34;看&#34;或者认为你需要&#34;它,你可以使用Laravel而不是CakePHP,这几乎可以使用facade pattern。但我保证你不会让你的代码变得更好。