2012-12-09 33 views
-1

我有一個名爲「config.php」的文件,其中包含一個名爲$unit_names的變量。在一個類中,我有以下方法,它通過它的id返回單元名稱。我將這種方法用於表中的所有行,但問題是config.php僅包含在對該方法的第一次調用中。接下來的通話會導致通知:undefined variable $unit_names...using include_once導致未定義的變量通知

如果我用include替換include_once,通知消失。但爲什麼? include_once應加載config.php文件。

public function get_unit_name($unit_id) 
    { 
      include_once("config.php"); 
      return $unit_names[$unit_id]; 
    } 
+2

'但問題是config.php文件只在第一次調用method'包括但聽起來像[include_one正在做它應該做的事情](http://php.net/include_once),不是嗎? –

+0

我有一個想法,但你需要發佈更多(其他的'include_once',其中的任何內容,'config.php'的內容)。 –

+1

把'include_once'放在函數之外不是更有意義嗎? –

回答

7

include_once不會加載指定的文件至少一次,它會一次加載正是!如果第二次調用該函數,則該文件已包含在內,因此不會再包含該文件,因此會顯示錯誤消息。

這樣做的想法是,當您包含包含函數或類定義的文件時,即使用include_once/require_once,即在多次加載時會產生錯誤的文件。如果可以加載文件兩次或更多次,請始終使用include()而不是include_once()

考慮這樣的事情,而不是(以節省重新包括文件每次費用):

private $unit_names = null; 

public function get_unit_name($unit_id) { 
    if ($this->unit_names === null) { 
     include("config.php"); 
     $this->unit_names = $unit_names; 
    } 

    return $this->unit_names[$unit_id]; 
} 
+0

好的。但是如果文件已經包含了,爲什麼我會收到此通知?如果已包含該變量,則該變量應該可用 – user16948

+1

第一次調用「get_unit_name()」時,「include_once()」語句將被指定文件的內容替換(顯然包含「 $ unit_name',所以一切都很好)。然而,PHP第二次再次評估'include_once()'語句並注意到文件已經被包含,因此不會再被包含(因爲使用了_once'版本) - 對於第二次調用,包含因此聲明將被忽略或「刪除」。 – Niko

+0

'...並且注意到文件已經被包含了,所以如果它已經被包含了,這個變量應該在下次調用中可用! – user16948

相關問題