PHP/CodeIgniter - Setting variables in __construct(), but they're not accessible from other functions
Solution 1
You haven't set $agent
in your index action, if you want variables set in the constructor accessible then you have to set them as a class property ie: $this->Agent = ...;
, and access them in the same way with $this->Agent->id
. (I would capitalise them to show that they are objects and not just variables) For example:
$this->User = $this->my_auth_library->get_user();
$this->Agent = $this->agent_model->get_agent($user->id);
The constructor behaves the same as any other class methods, its only special property is that it's automatically ran when the class is instantiated, normal variable scope still applies.
Solution 2
you need to define the variables outside the constructor, like this:
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');
}
}
then you can set and get them using $this->agent
Jack
Updated on July 09, 2022Comments
-
Jack almost 2 years
I'm happy a bit of a variable scoping problem. Maybe I just need more coffee...
Here's my (simplified) code - this is in 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'); }
Unfortunately, when I run the index function, I'm told:
A PHP Error was encountered Severity: Notice Message: Undefined variable: agent Filename: controllers/agent.php Line Number: 51
Line 51 is the first line of the index function. What's going wrong? Is this a scope issue or something else?
Thanks!
-
Jack over 12 yearsThanks for the comment explaining this - I had assumed that __construct() sort of 'prepended' it before the function and it was still accessible. Thanks!
-
jondavidjohn over 12 years+1 for declaring them class-wide before assigning, makes it much easier to keep track of what is class-wide.