Я доволен проблемой с переменным охватом. Может быть, мне просто нужно больше кофе …
Вот мой (упрощенный) код – это в CodeIgniter 2:
class Agent extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('agent_model'); // Get preliminary data that will be often-used in Agent functions $user = $this->my_auth_library->get_user(); $agent = $this->agent_model->get_agent($user->id); } public function index() { $this->template->set('info', $this->agent_model->get_info($agent->id)); $this->template->build('agent/welcome'); }
К сожалению, когда я запускаю функцию индекса, мне говорят:
A PHP Error was encountered Severity: Notice Message: Undefined variable: agent Filename: controllers/agent.php Line Number: 51
Строка 51 – первая строка индексной функции. Что случилось? Это вопрос о масштабах или что-то еще?
Благодаря!
Вы не задали $agent
в своем действии индекса, если вы хотите, чтобы переменные, установленные в конструкторе, были доступны, вы должны установить их как свойство класса, то есть: $this->Agent = ...;
, и получить доступ к ним одинаково с $this->Agent->id
. (Я бы использовал их, чтобы показать, что они являются объектами, а не только переменными) Например:
$this->User = $this->my_auth_library->get_user(); $this->Agent = $this->agent_model->get_agent($user->id);
Конструктор ведет себя так же, как и любые другие методы класса, его единственным специальным свойством является то, что он автоматически запускается при создании экземпляра класса, нормальная переменная область по-прежнему применяется.
вам нужно определить переменные вне конструктора, например:
class Agent extends CI_Controller { private $agent; private $user; public function __construct() { parent::__construct(); $this->load->model('agent_model'); // Get preliminary data that will be often-used in Agent functions $this->user = $this->my_auth_library->get_user(); $this->agent = $this->agent_model->get_agent($user->id); } public function index() { $this->template->set('info', $this->agent_model->get_info($this->agent->id)); $this->template->build('agent/welcome'); } }
то вы можете установить и получить их с помощью $this->agent