【问题标题】:Is it possible to dynamically extend a model in Codeigniter?是否可以在 Codeigniter 中动态扩展模型?
【发布时间】:2011-06-25 03:14:24
【问题描述】:
我在 CI 中的模型设置为在需要某些功能时加载“子”模型。为了使我的代码尽可能易于访问和清洁,我希望这些子模型扩展它们被调用的模型。
所以如果我有两个模型:
<?php
class Mymodel extends Model
{
}
还有:
<?php
class Submodel extends Model
{
function test() { do something.. }
}
然后我需要以某种方式让子模型扩展 mymodel,以便我可以执行类似 $this->mymodel->test() 的操作。子模型扩展的不一定是 mymodel,它可以是任何模型。有任何想法吗?
感谢您的宝贵时间。
【问题讨论】:
标签:
php
oop
model-view-controller
codeigniter
class-design
【解决方案1】:
您对类之间的继承有错误的理解。
继承只流向一种方式,向下。
如果Myodel extends Submodel 你的$this->mymodel->test() 可以工作,但这没有意义,因为假设子(子)对象是从父对象继承的,而不是相反。
打个比方,你不会看着孩子告诉父母“你看起来就像你的孩子”,因为孩子是父母的一部分。
您需要从字面上理解extends 这个词,您实际上是在“扩展”父级的功能。
====================
我相信您可以实现此目的的一种方法是创建幽灵函数,该函数只需加载正确的模型并调用该模型函数(尽管我不建议这样做,因为它可能会使调试变得非常混乱。
根据你的例子
<?php
class Mymodel extends Model
{
function test() {
$this->load->model('submodel');
$this->submodel->test();
}
}
子模型
<?php
class Submodel extends Model
{
function test() { do something.. }
}
但是,如果您要使用干净的代码,这不是正确的方法,请尝试观察继承,并在设计数据时牢记这一点。
【解决方案2】:
您可以创建可以扩展 codeigniter 模型的实用模型,然后您的所有模型都可以扩展该实用模型。您要添加到实用模型的方法将可用于它的所有子类,也就是您的模型。
您如何调用您的类没有或没有从任何其他类继承的方法?查看您的代码,您的类中 Mymodel 和 Submodel 之间没有关系。