2010-09-10 138 views
2

按照PHP manual $一個應當提供給b.inc在下面的代碼段PHP變量的作用域問題

<?php 
$a = 1; 
include 'b.inc'; 
?> 

然而,當我嘗試調用一個靜態方法時做同樣的,$一個似乎超出了範圍。

class foo { 
    public static function bar() { 
     $a = 1; 
     include('b.inc');    
    } 
} 

foo::bar(); 

我誤會了什麼嗎?編輯:好吧,我是一個白癡,每個人。我正在使用包裝函數 - 填充包含路徑。這使變量超出了範圍。謝謝您的幫助。

+0

b.inc – RobertPitt 2010-09-10 17:30:40

+0

的內容是什麼讓我們說「echo $ a;」爲了簡單起見。 – Greg 2010-09-10 17:31:18

回答

1

它完全適合我。如果您準確地描述了問題,則必須在b.inc內部發生$ a的情況。

+1

謝謝 - 我一定搞錯了。道歉。 – Greg 2010-09-10 17:35:10

+0

爲了記錄,您使用的是PHP 5.2.14,對吧? – 2010-09-10 17:36:40

+0

是的。我也有我的包括在foreach循環 - 但我不明白這將有什麼區別。只要我弄明白了,我就會發布我的錯誤。 – Greg 2010-09-10 17:39:31

0

在課堂內部,你需要說你的意思是全球性的。


class foo { 
    public static function bar() { 
     global $a; 
     var_dump($a); 
    } 
} 

foo::bar(); 
+3

你誤解了他的問題。他說,當他將它包含在一個靜態函數中時,該文件似乎看不到$ a。 – 2010-09-10 17:33:33

0
<?php 
//a.php 
class test 
{ 
    public static function run() 
    { 
     $a = 'Some value'; 
     include 'b.php'; //echo $a; 
    } 
} 
test::run(); 
?> 

所有在我的測試中都能正常工作。

0

功能範圍與全局範圍不同。 b.inc將會看到$ a,並且在b.inc中創建的任何變量都將在foo :: bar()的範圍內(除非它們被定義爲全局變量,或者在它們自己的函數範圍內)。

你可以用一些代碼測試:

function foo() { 
    $a = 1; 
    include '1.php'; // modify and initialize, ie. $a++; $b = 3; 
    include '2.php'; // test the values: $a == 2; $b == 3 
} 

我們碰到這個問題,偶爾當我們在其他腳本引導的WordPress:初始化腳本假定他們是在最外面的範圍,使他們將設置變量,如$wpdb (數據庫對象),但該文件實際上將在某個執行require_once()的函數中創建。解決方案是在進入任何功能範圍之前,始終在應用程序中引導WordPress。