Cieszy mnie trochę problem ze zmiennym zakresem. Może po prostu potrzebuję więcej kawy...

Oto mój (uproszczony) kod - to jest w 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');
}

Niestety, kiedy uruchamiam funkcję indeksu, otrzymuję informację:

A PHP Error was encountered

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

Linia 51 to pierwszy wiersz funkcji indeksu. Co się dzieje? Czy to kwestia zakresu, czy coś innego?

Dzięki!

6
Jack 22 sierpień 2011, 16:36
Nie ustawiasz żadnych zmiennych klasowych, tylko zmienne funkcyjne. Zobacz php.net/manual/en/language.oop5.properties.php
 – 
hakre
22 sierpień 2011, 16:41

2 odpowiedzi

Najlepsza odpowiedź

Nie ustawiłeś $agent w akcji index, jeśli chcesz, aby zmienne ustawione w konstruktorze były dostępne, musisz ustawić je jako właściwość klasy, tj.: $this->Agent = ...; i uzyskać do nich dostęp w ten sam sposób za pomocą $this->Agent->id. (Zapiszę je wielką literą, aby pokazać, że są obiektami, a nie tylko zmiennymi) Na przykład:

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

Konstruktor zachowuje się tak samo jak inne metody klas, jego jedyną specjalną właściwością jest to, że jest uruchamiany automatycznie, gdy klasa jest tworzona, nadal obowiązuje normalny zakres zmiennych.

13
Dunhamzzz 22 sierpień 2011, 16:39
Dzięki za komentarz wyjaśniający to - założyłem, że __construct() jakby "dołączył" go przed funkcją i nadal był dostępny. Dziękuję!
 – 
Jack
22 sierpień 2011, 16:47

Musisz zdefiniować zmienne poza konstruktorem, na przykład:

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

Następnie możesz je ustawić i uzyskać za pomocą $this->agent

9
ianbarker 19 styczeń 2016, 13:01
1
+1 za zadeklarowanie ich w całej klasie przed przypisaniem, znacznie ułatwia śledzenie tego, co dotyczy całej klasy.
 – 
jondavidjohn
22 sierpień 2011, 18:43