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

状況を少し明確にしておくと役立つかもしれません。コードをもう少し投稿してください。

たとえば、Modals(CodeIgniter内)は通常、「self ::」の使用を(ほぼ)説明するシングルトンクラスとして使用されますが、Productをオブジェクトにしたいようです。なぜそれを使用するのですか?

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

于 2012-12-08T00:19:35.677 に答える