PHP/CodeIgniter - Setting variables in __construct(), but they're not accessible from other functions

15,557

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

Share:
15,557
Jack
Author by

Jack

Updated on July 09, 2022

Comments

  • Jack
    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
    Jack over 12 years
    Thanks for the comment explaining this - I had assumed that __construct() sort of 'prepended' it before the function and it was still accessible. Thanks!
  • jondavidjohn
    jondavidjohn over 12 years
    +1 for declaring them class-wide before assigning, makes it much easier to keep track of what is class-wide.