了解php中的变量范围

时间:2010-08-23 14:02:07

标签: php scope

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的范围应该在花括号{}!

中结束

4 个答案:

答案 0 :(得分:11)

  

根据我的理解,$ a和$ b的范围应该在花括号{}!

中结束

只有函数和方法有自己的局部范围。其他控制结构(循环,条件......)没有。

Variable scope in the PHP manual

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在PHP中,只有函数引入了一个新的范围,与Java和其他语言不同:((( 因此,如果您需要新的范围,则需要创建一个新函数并调用它。

$a = 1;


 call_user_func(function(){
     //new local scope
     $a = 99999;
});


echo $a;   //will print 1

答案 3 :(得分:0)

范围是您可以访问变量(或属性或方法)的边界。您的代码不是范围的示例,它是语法分析。在双引号内,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