2011-08-22 25 views
5

Tôi rất vui vì có một vấn đề về phạm vi biến. Có lẽ tôi chỉ cần cà phê thêm ...PHP/CodeIgniter - Thiết lập các biến trong __construct(), nhưng chúng không thể truy cập được từ các hàm khác

Dưới đây là của tôi (giản thể) mã - đây là trong 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'); 
} 

Thật không may, khi tôi chạy chức năng chỉ số, tôi nói:

A PHP Error was encountered 

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

Dòng 51 là dòng đầu tiên của hàm chỉ mục. Có chuyện gì vậy? Đây có phải là vấn đề về phạm vi hay thứ gì khác không?

Cảm ơn!

+0

Bạn sẽ không thiết lập bất kỳ biến lớp, chỉ có chức năng biến. Xem http://www.php.net/manual/en/language.oop5.properties.php – hakre

Trả lời

11

Bạn chưa thiết $agent trong action index của bạn, nếu bạn muốn biến đặt trong các nhà xây dựng truy cập sau đó bạn phải thiết lập chúng như là một ví dụ tài sản lớp: $this->Agent = ...;, và truy cập chúng trong cùng một cách với $this->Agent->id. (Tôi sẽ tận dụng chúng để chứng minh rằng họ là những đối tượng và không chỉ biến) Ví dụ:

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

Các constructor cư xử giống như bất kỳ phương pháp lớp học khác, tài sản duy nhất đặc biệt của nó là nó tự động chạy khi lớp là phạm vi biến đổi bình thường, tức thời vẫn được áp dụng.

+0

Cảm ơn nhận xét đã giải thích điều này - tôi đã giả định rằng __construct() sắp xếp 'đã được thêm trước' nó trước hàm và nó vẫn còn có thể truy cập. Cảm ơn! – Jack

9

bạn cần xác định các biến bên ngoài các nhà xây dựng, như thế này:

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

sau đó bạn có thể thiết lập và làm cho họ sử dụng $this->agent

+0

Cảm ơn bạn, '$ this-> user -> ...' hoạt động rất tốt. Cảm ơn! – Jack

+1

+1 để khai báo chúng trong toàn bộ lớp học trước khi chỉ định, giúp bạn dễ dàng theo dõi toàn bộ lớp học. – jondavidjohn

Các vấn đề liên quan