2010-08-23 89 views
2
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"; 

为什么上面的代码打印出以下内容?了解php中的变量范围

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

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

回答

11

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

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

Variable scope in the PHP manual

+0

@ tzmatt7447要知道为什么这是_desired_行为,请考虑代码如 if(1 <2){a = true; b =“yellow”;} else {a = false; B = “蓝色”; } 这是不可能的,如果范围工作就像你建议 – 2010-08-23 15:09:30

+0

@迈克尔 - 我现在看到如何php做到这一点,但你说的应该是有效的,如果a和b事先声明...我在想什么太多的C/C++? :) – tzmatt7447 2010-08-25 13:20:22

+0

谢谢佩卡 - 这确实很好地解释它.. – tzmatt7447 2010-08-25 13:22:38

1

第一个$和$ b实际上会抛出一个警告,因为他们还没有在输出前宣布未定义的指标。

+3

真实和好的一点,但应该是一个评论,因为它与问题无关 – 2010-08-23 14:09:00

+0

嗯,我认为打破整个代码是为了解决这个问题。 – MRW 2010-08-23 14:12:34

+0

不,变量的范围与这个问题有关。佩卡是正确的。这是一个非常好的和有效的**点,而不是一个答案。 – Stephen 2010-08-23 14:13:55

0

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

大括号用于多种用途。在你的代码的情况下,他们划定的开始,如果您若(...)条件结束,在

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) 

既然你想让它$解析不是$ ABAR,你会使用{..}指定变量名的开头和结尾:

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

在PHP中只有功能引入一个新的范畴,不像Java等语言:((( 所以如果你需要一个新的作用域需要创建一个新的函数并调用它。

$a = 1; 


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


echo $a; //will print 1