2011-08-22 14 views
5

Me alegro de que haya un problema de alcance variable. Tal vez sólo necesito más café ...PHP/CodeIgniter: configuración de variables en __construct(), pero no se puede acceder a ellas desde otras funciones

Aquí está mi (simplificado) código - esto es en 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'); 
} 

Por desgracia, cuando corro la función de índice, que me dicen:

A PHP Error was encountered 

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

La línea 51 es la primera línea de la función de índice. ¿Qué está mal? ¿Es esto un problema de alcance o algo más?

Gracias!

+0

No está configurando las variables de clase, simplemente funcionar variables. Ver http://www.php.net/manual/en/language.oop5.properties.php – hakre

Respuesta

11

no ha configurado $agent en su acción index, si quieres variables establecidas en el constructor accesible, entonces usted tiene que establecer como una propiedad de clase es decir: $this->Agent = ...;, y acceder a ellos de la misma manera con $this->Agent->id. (Me gustaría sacar provecho de ellos para mostrar que son objetos y no sólo las variables) Por ejemplo:

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

El constructor se comporta igual que cualquier otro método de clase, su propiedad sólo es especial es que está corriendo de forma automática cuando la clase es El ámbito de variable variable instanciado todavía se aplica.

+0

Gracias por el comentario que explica esto - Yo había asumido que __construct() tipo de 'antepasado' antes de la función y todavía estaba accesible. ¡Gracias! – Jack

9

es necesario definir las variables fuera del constructor, así:

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'); 
    } 
} 

entonces se puede establecer y hacer que el uso de $this->agent

+0

Gracias, '$ this-> user -> ...' funciona muy bien. ¡Gracias! – Jack

+1

+1 para declararlos en toda la clase antes de la asignación, hace que sea mucho más fácil hacer un seguimiento de lo que es una clase. – jondavidjohn

Cuestiones relacionadas