復制代碼 代碼如下:
 
<?php 
function Test() 
{ 
static $count = 0; 
$count++; 
echo $count; 
if ($count < 10) { 
Test(); 
} 
$count--; 
} 
?> 
復制代碼 代碼如下:
 
<?php 
echo 'start<br />'; 
static $a = 10; 
echo "$a <br />"; 
unset($GLOBALS['a']); 
echo "$a <br />"; 
static $a = 20; 
echo "$a <br />"; 
$GLOBALS['a'] = 10; 
echo "$a <br />"; 
static $a = 30; 
echo "$a <br />"; 
unset($GLOBALS['a']); 
echo "$a <br />"; 
static $a; 
echo "$a <br />"; 
static $a = 40; 
echo "$a <br />"; 
$a = 100; 
echo "$a <br />"; 
static $a = 50; 
echo "$a <br />"; 
static $a = 4; 
echo "$a <br />"; 
echo 'end <br />'; 
exit; 
?> 
執行結果如下:
start 
(結果中關于文件位置的部分已刪去。也可以去掉echo語句使用zend的debug功能查看,這樣結果更清晰)
第10行再次輸出時,輸出結果仍是4而不是20,有兩種可能,一個是php再次初始化了$a的值,另一種是php使用了$a被銷毀前的值,這個問題在第20行輸出的時候解決。第16行$a銷毀的時候值為10,第19行聲明后輸出仍為10。
第11行將$a的值修改為10,在14行再次聲明$a,17行輸出認為10。推測為重復聲明時php還是使用靜態變量內存中的值,而不再次賦值。
至此,手冊中發現的問題,大致上已經解決了,即遞歸調用中的聲明沒有改變$count的值,所以遞歸在$count=10時成功停止。
可能有理解不正確的地方,歡迎拍磚。
新聞熱點
疑難解答