Загрузка нескольких моделей codeigniter с одинаковыми именами функций вызывает перезапись? - PullRequest
2 голосов
/ 18 ноября 2010

Если внутри конструктора моего контроллера, я загружаю две разные модели, например,

$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';
    }
        ...
}

, а модель Карандаши имеет аналогичный конструктор с именем таблицы, как ' карандаши '.

Теперь индексная функция контроллера имеет следующее значение:

echo $this->Pens_model->getTableName()."\n";
echo $this->Pencils_model->getTableName()."\n";

Что я наблюдаю, так это то, что имя таблицы модели, которая была загружена последней (в данном случае карандашами), печатается дважды - как если бы имя таблицы и функции перезаписывались.Это ошибка CI / ограничение или ошибка в моей реализации?

1 Ответ

2 голосов
/ 18 ноября 2010

php ver <5.3 </p>

Статические переменные совместно используются в дереве наследования, что означает:

Вы расширили класс модели с помощью 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 ver> = 5.3

static:: ссылка была введена вphp 5.3 для решения проблемы позднего статического связывания (оно разрешается статическим классом, вызываемым во время выполнения), но self:: все еще ссылается на родительский класс, поскольку статический вызов self будет разрешен во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...