PHP / CodeIgniter - установка переменных в __construct (), но они не доступны из других функций - PullRequest
6 голосов
/ 22 августа 2011

Я доволен проблемой с изменяемой областью видимости. Может быть, мне просто нужно больше кофе ...

Вот мой (упрощенный) код - это в 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');
}

К сожалению, когда я запускаю функцию index, мне говорят:

A PHP Error was encountered

Severity: Notice
Message: Undefined variable: agent
Filename: controllers/agent.php
Line Number: 51

Строка 51 - это первая строка индексной функции. Что не так? Это проблема объема или что-то еще?

Спасибо!

Ответы [ 2 ]

13 голосов
/ 22 августа 2011

Вы не установили $agent в своем действии индекса, если вы хотите, чтобы переменные, установленные в конструкторе, были доступны, тогда вы должны установить их как свойство класса, то есть: $this->Agent = ...;, и обращаться к ним так же, как с $this->Agent->id. (Я бы использовал их, чтобы показать, что они являются объектами, а не просто переменными). Например:

$this->User   = $this->my_auth_library->get_user();
$this->Agent  = $this->agent_model->get_agent($user->id);

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

9 голосов
/ 22 августа 2011

вам нужно определить переменные вне конструктора, например:

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

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