PHPs变量范围

时间:2014-03-06 09:22:03

标签: php

这可能看起来像一个微不足道的问题,但由于我在使用php大约8个月之后才意识到这一点,我认为这需要一些关注。我习惯于强类型语言,比如java,但我也喜欢弱类型语言(不知何故)。

好的,所以对于这个问题,我在一个函数中定义一个变量,在第三级foreach循环中。像

这样的东西
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     
      }

   }
}

在上面的例子中,最后一个if条件确实返回true,即使$ new var没有被声明为全局变量,那么如何在foreach循环之外访问它? 它不应该给出一个未定义的错误吗?

nb.I我已经查看了php doc

2 个答案:

答案 0 :(得分:5)

  

即使$ new var未被声明为全局变量,所以如何   它会在foreach循环之外访问吗?

您假设foreach为函数,A foreach不是函数,而是语言构造。

在控制结构中分配了值的变量不会受到范围问题的影响,即使是最里面的控制结构也可以访问它。 !

isset检查变量是否已赋值。因此,当您到达最里面的foreach时,将分配值,因此当您isset显然会返回true时。

答案 1 :(得分:5)

与javascript非常相似,PHP的变量范围限定为函数级别。所以你的变量将在任何foreach,for循环或者循环设置后的isset()中返回true。 PHP没有任何循环范围的概念。

值得一提的是,函数范围比javascript更严格。在不使用use()语句的情况下,使用函数的闭包不能访问调用函数的上下文:

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();