2011-04-01 53 views
0

我在使用MySQL 5.1.48社區的Apache 2.2.14上使用CodeIgniter 2.0和PHP5.3.2。我創建了一個小型測試控制器來隔離另一個問題,並發現我的問題似乎是由公共變量訪問引起的。調用test1或test2將導致錯誤,因爲它們看不到其他函數中設置的數組元素的值。有沒有人有任何想法,爲什麼這不起作用?如果是這樣,我需要能夠訪問全班變量的解決方案是什麼。爲什麼我不能從類函數訪問PHP5類中的公共變量的值?

謝謝。

<?php 
class Test extends CI_Controller 
{ 
    public $data; 

    function __construct() 
    { 
    parent::__construct(); 
    $this->data = array(); 
    } 

    function index() 
    { 
    $this->data['test1'] = 'This is a test of class public variable access.<br />';   
    echo 'Class index() called.<br />'; 
    echo $this->data['test1']; 
    } 

    function test1() 
    { 
    $this->data['test2'] = 'This is a second test of the class public variable access.<br />';   
    echo 'Class test1 called.<br />'; 
    echo $this->data['test1']; 
    echo $this->data['test2']; 
    } 

    function test2() 
    { 
    echo 'The data array contains these two entries:<br />'; 
    echo $this->data['test1']; 
    echo $this->data['test2']; 
    } 
} 
/* End of file test.php*/ 
/* Location: */ 
+2

這些調用的順序和順序是什麼以及輸出是什麼? – deceze 2011-04-01 01:22:52

+1

錯誤信息的確切用詞是什麼? – Unsigned 2011-04-01 01:43:37

+0

無法從查看此代碼中看出...需要CI_Controller以及錯誤消息的詳細信息。 – 2011-04-01 06:24:04

回答

1

錯誤出現在您的代碼中。當您__construct()該課程時,$this->data等於array()。一個空陣列。唯一應該工作的行是test1()函數中的最後一行。

index()test1()刪除所有的print語句,並嘗試這個辦法:

function test2() 
    { 
     $this->index(); 
     $this->test1(); 
     echo 'The data array contains these two entries:<br />'; 
     echo $this->data['test1']; 
     echo $this->data['test2']; 
    } 

這應該工作,因爲現在你已經通過運行定義它們的功能定義的數組鍵。

嘗試在您的__construct中定義它們,如果您需要在班級的每種方法中訪問它們。

+0

事實證明,這個問題是由CodeIgniter在每次調用一個函數而不是正確創建一個單例對象時創建一個新的控制器對象實例的事實引起的。因此,對不同函數的每個調用都在處理不同的對象和不同的數據,這意味着無論前一個函數存儲的數據是否可用。 – user686779 2011-04-02 15:47:44

+0

我建議你回答你自己的問題,並接受它,因爲你是絕對正確的:) – 2011-04-02 15:56:37

+0

@user我不知道CI的具體情況,但通常每個請求只有一個控制器操作。除非你在一個請求中明確地調用了幾個方法,否則它不是單例對象的問題,而是請求之間的數據持久性(在PHP中不會發生這種情況)。 – deceze 2011-04-03 23:53:51

相關問題