2010-08-23 94 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