如果在我的控制器的构造函数中,我加载了两个不同的模型,例如,
$this->load->model('Pens_model');
$this->load->model('Pencils_model');
其中每个模型扩展MY_Model,MY_Model具有以下轮廓,
class MY_Model extends Model
{
protected static $tablename = "";
protected static $title = "";
protected static $idattribute = 'id';
...
...
function getTableName(){
return self::$tablename;
}
}
笔模型有:
class Pens_model extends My_model {
function Pens_model(){
parent::MY_Model();
self::$tablename = "pens";
self::$title = 'Pens';
}
...
}
并且Pencils模型有一个类似的构造函数,表名为' pencils '。
现在控制器的索引函数具有以下内容,
echo $this->Pens_model->getTableName()."\n";
echo $this->Pencils_model->getTableName()."\n";
我观察到的是,最后加载的模型的表名(在这种情况下为铅笔)打印出两次 - 好像表名和函数被覆盖一样。 这是CI错误/限制还是我的实施中的错误?
答案 0 :(得分:2)
php ver< 5.3
静态变量在整个继承树中共享,这意味着:
您已使用MY_Model扩展了模型类。
Codeigniter首先加载My_Model
,然后加载扩展类Pen_Model
和Pencils_Model
。
您已在static $tablename
中定义My_Model
一次,并且这两个类(Pen_Model
和Pencils_Model
)将使用相同的引用。
在这种情况下,值将是第一个“”(您希望看到这个),而不是您将加载Pen_Model
,它将从父类引用相同的静态表名,因此值将为 Pen 。
然后您将加载Pencils_Model
,表名的值将为Pencils
(它与类Pen_Model
中的引用的引用相同)
所以..当你回显这些值时,它会显示你设置的最后一个值,在你的情况下是铅笔。
在php 5.3中引入了php ver> = 5.3
static::
引用来解决后期静态绑定的问题(它解析为在运行时调用的静态类),但是self::
仍然引用父类,因为静态调用自我将在编译时解决。