2011-06-21 163 views
1

我在理解PHP中的包含和函數範圍時遇到了一些麻煩,有些Google搜索沒有提供成功的結果。但現在的問題是:功能範圍在PHP中包括包括在內

這不起作用:

function include_a(){ 
    // Just imagine some complicated code 
    if(isset($_SESSION['language'])){ 
     include 'left_side2.php'; 
    } else { 
     include 'left_side.php'; 
    } 
    // More complicated code to determine which file to include 
} 

function b() { 
    include_a(); 
    print_r($lang); // Will say that $lang is undefined 
} 

所以基本上,存在left_side.phpleft_side2.php稱爲$lang的數組。我想在b()之內訪問它,但上面的代碼設置會說$lang未定義。但是,當我複製並粘貼最初的include_a()中的確切代碼時,它將正常工作。但正如你所想象的,我不希望將代碼複製並粘貼到我需要的每個函數中。

如何緩解這個範圍問題,我做錯了什麼?

回答

2

如果數組$langinclude_a()函數中被定義,那麼它僅限於該函數的範圍,即使該函數在b()內被調用。要訪問b()中的$lang,您需要在全球範圍內調用它。

發生這種情況是因爲你include 'left_side2.php';裏面的include_a()函數。如果在包含內定義了多個變量,並且您希望它們位於全局範圍內,那麼您需要將它們定義爲這樣。

left_side.php內部,其定義爲:

$GLOBALS['lang'] = whatever...; 

然後在調用它們的功能,試試這個:

function b() { 
    include_a(); 
    print_r($GLOBALS['lang']); // Now $lang should be known. 
} 
+0

啊,謝謝。我不知道$ GLOBALS功能。儘管調用聯想的$ GLOBALS有一個古怪的語法(即$ GLOBALS ['lang'] ['EMAIL']),但一切都很好。現在不需要include_a()函數。 再次感謝您。 – id2341677

1

它被認爲是「壞習慣」,你不要使用全局變量不必(我不贊同,但普遍接受)。更好的做法是通過在傳入變量前添加一個&符號來引用,以便編輯該值。

所以裏面left_side或left_side2你會:

b($lang); 

和b是:

function b(&$lang){...} 

如需進一步定義可變範圍check this out

+0

那麼,編輯這些文件需要進行大修,如果我這樣做的話,恐怕這不是那麼可行。然而,爲了緩解奇怪的'$ GLOBALS ['array'] ['property']'語法問題,我可以在每個函數的頂部定義'global $ lang',然後訪問'$ lang'正常情況下(如鏈接所示,謝謝)。一種方式比另一種更好,還是它們在性能方面都相同? – id2341677

+0

我還沒有運行任何測試是肯定的,但我想這種差異是微不足道的,因爲它們都調用現有變量的全局引用(而不是實例化新副本)。 – meteorainer