$ this keyword in view в CodeIgniter

Я пытаюсь понять, как $this->load->view() работает внутри файла вида в CodeIgniter.

Ядро / Controller.php вызывает core / Loader.php, который затем вызывает _ci_load (), который, в свою очередь, include('/path/to/view');

Не стоит ли $this ссылаться на класс Loader в этот момент? Как это $this ссылается на контроллер?

По моему мнению, вам нужно будет вызвать $ this-> view () внутри файла вида. Не $ this-> load-> view (), потому что функция load () недоступна внутри загрузчика. Это переменная класса базового класса Controller. т.е. $this->load =& load_class('Loader');

Обратите внимание: я пытаюсь понять внутренности CodeIgniter. Я прекрасно знаю, как встраивать файлы просмотра в другие файлы представлений в качестве пользователя CodeIgniter. Пожалуйста, не оставляйте ответы, объясняющие, как использовать $ this-> load ().

В прошлый раз, когда я проверил, $this был класс CI_Loader , попробуйте var_dump($this); внутри вида.


Проверять, выписываться:

https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Controller.php

is_loaded(); возвращает массив с уже загруженными именами классов и их псевдонимами из основного контейнера.

$this->load – это экземпляр CI_Loader внутри контроллера.


Проверьте:

https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Loader.php

Линия 778

Чтобы упростить понимание того, что $this означает в представлении, поскольку представление «загружено» с помощью метода контроллера, представление все еще выполняется в той же области, что и этот метод, что означает, что $this может иметь другой контекст, в зависимости от того, класс загрузил его.

Например:

 class Controller1 extends CI_Controller {} 

В любом файле просмотра, загруженном в этот примерный контроллер, $this относится конкретно к классу Controller1 , который также может иметь доступ CI_Controller общедоступным и защищенным свойствам / методам CI_Controller (например, классы Loader или Input, которые назначаются свойствам load и input CI_Controller ), поскольку он расширяет этот класс.

Контроллеры по-прежнему являются просто старыми классами PHP. Если бы я сделал это:

 class Controller1 extends CI_Controller { $this->foobar = 'Hello'; } class Controller2 extends CI_Controller { $this->foobar = 'World'; } 

… если мы загрузим один и тот же файл вида в любом методе любого из этих контроллеров, используя $this->foobar в этом файле просмотра будет возвращено другое значение.