2014-03-06 64 views
0

這看起來可能只是一個微不足道的問題,但由於我在使用php大約8個月後才意識到這一點,我認爲這需要一些注意力。我習慣於強類型的語言,比如java,但我也喜歡弱類型的語言(不知何故)。好的,所以對於這個問題,我正在定義一個函數內的變量,在第三級foreach循環中。喜歡的東西PHP變量作用域

for($x =0; $x <= 20; $x++){ 
    for($x =0; $x <= 5; $x++){ 
     foreach($arr as $var){ 
     $new_arr = $var; 
     } 

     if(isset($new_arr)){ 
     //code executes here  
     } 

    } 
} 

在上面的例子中,如果最後沒有條件返回true,儘管$新變種未聲明爲一個全局變量,所以它怎麼會是foreach循環外部訪問? 它不應該給一個未定義的錯誤?

nb.I已經看了php doc

+3

PHP沒有爲'if','foreach'等。在聲明的所有變量局部範圍那些被認爲是整個功能的本地功能。 –

回答

5

很像javascript,PHP的變量被限定爲一個函數級別。所以你的變量將在任何foreach中爲isset()返回true,或者在設置後的while循環中返回true。 PHP沒有任何循環範圍的概念。

還值得一提的是函數作用域比javascript更嚴格一些。如果不使用帶功能使用()語句關閉不具備訪問調用函數的上下文:

function ScopeOne() { 
    $myVar = "hello"; 
    $scopeTwo = function() { 
     return isset($myVar); 
    }; 

    $doesScopeTwoHaveAccessToScopeOne = $scopeTwo(); 

    if ($doesScopeTwoHaveAccessToScopeOne) { 
     echo "this won't be true"; 
    } else { 
     echo "Scope Two can not access variables in scope one"; 
    } 
} 

ScopeOne(); 
5

即使$新變種未聲明爲一個全局變量,因此如何 會是foreach循環外部訪問?

我們假定你是foreach的功能,foreach不是一個函數,而是語言結構。

已在控件結構中賦值的變量不受範圍問題的影響,即使最內層的控件結構也可以訪問它。 !

isset檢查變量是否已被賦值。所以當你到達你最內層的foreach時,這個值將被分配,所以當你做isset顯然它會返回true

+0

是的,當然這個foreach不是一個函數。假設for循環被包裝在一個函數中。在java中,一個定義在循環中的變量,如果沒有在循環外部定義,將會失去其作用域。 – LogixMaster

+0

如果它位於'for','foreach','if'內,則不會受範圍問題影響。 ..(在控制結構下) –

+0

感謝您的回答!我正在尋找的答案是解釋瞭如何PHP沒有循環範圍的問題!我會將你的標記標記爲有用的,但史蒂夫B的答案,因爲它正是我想要的。謝謝你盡力解釋的努力!歡呼 – LogixMaster