这个问题非常具体且冗长,涉及扩展 CodeIgniter 的模型。这并不重要(我的应用程序目前工作)但我问这个是因为我想知道是否有一种“干净”的方式来做到这一点。
我最近写了一篇关于我用来使 CRUD 方法对我的模型通用的技巧的博客文章。因为我只在涉及模型时使用“数据库”库,所以我扩展了核心模型 (MY_Model) 以简单地从其构造函数加载数据库,而不是自动加载它。自动加载它并不是什么大问题,但重点是(这对接下来的内容很重要);我以后可能想用这个构造函数来执行其他的事情,所以需要有一个构造函数。
当我考虑使 CRUD 方法通用时,我考虑再次使用 MY_Model,并且能够成功定义“create”、“update”、“delete”和“load_from_id”方法。但是,这些方法隐含地依赖于一个接口,或者需要在任何模型中定义的一组方法(除了静态/常量参数覆盖之外,例如一些验证,或者要在删除时调用的函数以级联特定结果在数据库中)。两种解决方案;使用 PHP接口或使 MY_Model抽象并声明抽象方法。
解决方案2无法实现,因为我需要在MY_Model中有一个有效的构造函数,而且无论如何,我需要能够调用CI_Model的构造函数(即使到目前为止没有任何东西,我也不能假设永远不会) . 在这种情况下,继承堆栈将是 (concrete [ CI_Model
], abstract [ MY_Model
],concrete [ ]),从我的具体模型Any_model
调用时我需要“跳过一代” 。parent::__construct();
另外我不知道 CI 是否支持抽象核心类扩展。
对于解决方案1,我也不确定它是否可以实现。假设我定义了一个具体的类MY_Model
和一个接口CrudModelInterface
。我把所有的属性都放进去MY_Model
(它们不能在界面中),但是我的 CRUD 方法需要使用它们,所以CrudModelInterface
必须扩展MY_Model
对吗?这就是我变得模糊的地方......
如果你明白我想做什么,你能告诉我我的设计,你会怎么做,等等。任何建设性的。目前,我根本没有强加约束来定义那些“接口方法”,但我在每个模型中都这样做,所以它有效。它只是不是很干净。