我正在使用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');
因此有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);
但如果可以,我宁愿自动化它。
答案 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