0

我正在使用 CodeIgniter 并扩展了CI_Model. 所以我所有的模型现在都扩展了MY_Model

这工作正常。

问题是我所有的模型都有一个辅助关联对象。基本上是一个从模型(通常来自数据库)获取传递数据并表示数据库中的行的类。

所以像

class Product_Model extends MY_Model{
    public function get($id){
        //....
        return new Product($query->row()); 
    }
}


class Product{

    public function __construct(stdClass $data){
      //....
      self::$ci =& get_instance();
      self::$model = self::$ci->products;
    }

}

现在我用别名加载 Product_Model$this->load->model('product_model', 'products');

因此有self::$model = self::$ci->products;

但是现在我想要一个基础类,所有的类Product都可以扩展。

我希望它包含更新的逻辑self::$model

但我需要知道模型别名。

就像是

self::$model = self::$ci->{instantiator_variable_name($this)}这将是self::$model = self::$ci->products

现在显然该功能不存在,但它显示了我想要做什么。

我知道我可以在任何我创建的Product或类似的地方拥有

$row = $query->row();
$row->model = $this->ci->products;
return new Product($row);

但如果可以的话,我宁愿自动化它。

4

1 回答 1

1

如果您稍微澄清一下情况可能会有所帮助。请发布更多您的代码?

例如,Modal(在 CodeIgniter 中)通常用作单例类,它(几乎)解释使用 'self::" 但看起来你希望 Product 成为一个对象。那么为什么要使用

self::$model 

代替

$this->model

您为 products 模型起别名的事实使我认为您可能是故意这样做的(这就是为什么我很困惑,您为什么要这样做?)。我认为您应该查看“self::”、“static::”和“$this->”之间的区别。看看http://php.net/manual/en/language.oop5.late-static-bindings.php

rockstarz 是正确的,你需要使用工厂模式。考虑这样的事情:

class ItemFactory {

    private $model;

    public function __construct($model) {
        $this->model = $model;
    }

    function create_product(stdClass $data) {
        $product = new Product($data);
        $product->set_model($this->model);
        return $product
    }
}

abstract class Item {

    protected $model;
    protected $ci = & get_instance();

    public function __construct(stdClass $data) {
        // whatever
    }

    public function set_model($model) {
        $this->$model = $model;
    }

    public function get_model() {
        return $this->model;
    }

}

class Product extends Item {
    // whatever
}

然后你的模型可以像使用它一样

class Product_Model extends MY_Model {

    private $item_factory;

    public function __construct() {
        $this->item_factory = new ItemFactory($this);
    }

    public function get($id){
        return $this->item_factory->create_product($row);
    }

}

相关阅读材料:

http://en.wikipedia.org/wiki/Inversion_of_control#Implementation_techniques

http://en.wikipedia.org/wiki/Factory_method_pattern

http://en.wikipedia.org/wiki/Dependency_injection

于 2012-12-08T00:19:35.677 回答