加载多个具有相同功能名称的codeigniter模型会导致覆盖?

时间:2010-11-17 22:53:19

标签: codeigniter models

如果在我的控制器的构造函数中,我加载了两个不同的模型,例如,

$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错误/限制还是我的实施中的错误?

1 个答案:

答案 0 :(得分:2)

  

php ver< 5.3

静态变量在整个继承树中共享,这意味着:

您已使用MY_Model扩展了模型类。

Codeigniter首先加载My_Model,然后加载扩展类Pen_ModelPencils_Model

您已在static $tablename中定义My_Model一次,并且这两个类(Pen_ModelPencils_Model)将使用相同的引用。

在这种情况下,值将是第一个“”(您希望看到这个),而不是您将加载Pen_Model,它将从父类引用相同的静态表名,因此值将为 Pen
然后您将加载Pencils_Model,表名的值将为Pencils(它与类Pen_Model中的引用的引用相同)
所以..当你回显这些值时,它会显示你设置的最后一个值,在你的情况下是铅笔

  

php ver> = 5.3

在php 5.3中引入了

static::引用来解决后期静态绑定的问题(它解析为在运行时调用的静态类),但是self::仍然引用父类,因为静态调用自我将在编译时解决。