Code Igniter获取创建对象的模型实例的名称?

时间:2012-12-06 03:28:54

标签: php codeigniter class instance

我正在使用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;
    }

}

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

加载Product_Model

因此有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);

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

1 个答案:

答案 0 :(得分:1)

如果你稍微澄清一下情况,可能会有所帮助。请发一下你的代码吗?

例如,Modals(在CodeIgniter中)通常用作单例类(几乎)使用'self ::'来解释,但看起来你想要Product是一个Object。那么为什么要使用

self::$model 

而不是

$this->model

你对产品模型的别名这一事实让我觉得你可能是故意这样做的(这就是为什么我很困惑,你为什么要这样做?)。我想你应该检查“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