2014-03-06 28 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