【问题标题】:Understanding variable scopes in php理解 php 中的变量作用域
【发布时间】:2010-08-23 14:02:07
【问题描述】:
echo "Point1, a=".$a."\n";
echo "Point1, b=".$b."\n";
if(1<2)
    {
        $a = 6; 
        $b['link'] = "here";
        echo "Point2, a=".$a."\n";
        echo "Point2, b[link]=".$b['link']."\n";
    }
echo "Point3, a=".$a."\n";
echo "Point3, b[link]=".$b['link']."\n";

为什么上面的代码会打印出以下内容?

Point1, a=
Point1, b=
Point2, a=6
Point2, b[link]=here
Point3, a=6
Point3, b[link]=here

在我的理解中,$a 和 $b 的范围应该在花括号 { } 内结束!

【问题讨论】:

    标签: php scope


    【解决方案1】:

    在我的理解中,$a 和 $b 的范围应该在花括号 { } 内结束!

    只有函数和方法有自己的局部作用域。其他控制结构(循环、条件...)则不然。

    Variable scope in the PHP manual

    【讨论】:

    • @tzmatt7447 要了解为什么这是 期望 行为,请考虑类似 if (1
    • @Michael - 我现在知道 php 是如何做到的,但是如果事先声明了 a 和 b,你所说的应该是有效的......我是不是想太多 C/C++? :)
    • "我想太多 C/C++ 了吗?" - 很可能是。 Php 可以使用 $ar[] = 7 之类的东西,它声明一个数组,创建它并一次性添加它的第一个元素。
    【解决方案2】:

    第一个 $a 和 $b 实际上会抛出一个警告,未定义的索引,因为它们在输出之前没有被声明。

    【讨论】:

    • 正确和好点,但应该是评论,因为它与问题无关
    • 好吧,我认为破坏整个代码与问题有关。
    • 不,变量范围与问题有关。佩卡是正确的。这是一个非常好的和有效的,而不是答案。
    【解决方案3】:

    在 PHP 中,只有函数引入了新的作用域,这与 Java 和其他语言不同 :((( 所以如果你需要一个新的作用域,你需要创建一个新的函数并调用它。

    $a = 1;
    
    
     call_user_func(function(){
         //new local scope
         $a = 99999;
    });
    
    
    echo $a;   //will print 1
    

    【讨论】:

      【解决方案4】:

      范围是您可以访问变量(或属性或方法)的边界。您的代码不是范围的示例,而是语法解析。在双引号内,php 将识别并尝试评估变量。因为 $b[..] 是你引用数组元素的方式,php 会尝试这样解析它。

      花括号用于多种用途。在您的代码上下文中,如果您的 if(...) 条件,它们会分隔开始和结束,如

      if (condition)
        {
          // do all
          // of this stuff
          // between the { and }
          // if the condition
          // is true
        }
      

      这与范围无关,除非您想从“这是在条件为真时执行的代码开始和结束的地方”的意义上来看待它,但如前所述,这并不是真正的“范围”方法。

      您也可以使用 {..} 告诉 php 从哪里开始和结束变量名,以避免歧义。例如:

      在本例中,php 将尝试将变量解析为 $abar,因为这是一个有效的变量名:

      $a = "foo";
      $b = "$abar"
      echo $b; // output : nothing - $abar doesn't exist (will give you a notice)
      

      由于您希望它解析 $a 而不是 $abar,您可以使用 {..} 来指定变量名的开头和结尾:

      $a = "foo";
      $b = "${a}bar"
      echo $b; // output : foobar
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-03
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多