2015-09-18 46 views
1

代碼聲明結構工作:如何在PHP

declare(ticks=1); 

function tick_handler(){ 
    echo "tick_handler() called\n"; 
} 

register_tick_function('tick_handler'); 
$a = 1; 
if($a < 2){ 
    // $a += 2; 
} 

當我運行此代碼,將打印tick_handler() called 4 times.I認爲$a = 1將打印tick_handler() called一個時代,但爲什麼它打印四倍。 如果我改變的第一行代碼:

declare(ticks = 2) 

將打印像以前一樣的結果。 在PHP文件,它說:

A tick is an event that occurs for every N low-level tickable statements executed by the parser within the declare block 

所以我想如果ticks = 2,它將打印兩次,但事實並非如此。 現在,我不知道它是如何工作的。

回答

1

考慮運行這個代碼,增加滴答並再次運行,從1到10(或多或少),那麼你可能會得到它是如何工作的。

declare(ticks=1); 
function tick_handler(){ 
    echo "tick_handler() called<br>"; 
} 
echo("1<br>"); 
register_tick_function('tick_handler'); 
echo("2<br>"); 
$a = 1; 
echo("3<br>"); 
if($a < 2){ 
    echo("4<br>"); 
    // $a += 2; 
} 
echo("5<br>"); 

我將它解釋爲:每N「滴答」(其可以是一個深奧的方式PHP具有測量其內的指令來運行的單個高級調用(如印刷))調用此函數。您無法使等價2 tick =>一條指令,1個ticks =>兩條指令。

您的代碼的「問題」是您在註冊滴答處理程序之前設置了滴答編號,然後因爲該功能尚未註冊而錯過了一個呼叫。其實,這個電話是在Tick Tick的註冊過程中發出的。如果您在聲明後開始計數蜱

function tick_handler(){ 
    echo "tick_handler() called<br>"; 
} 

register_tick_function('tick_handler'); 
declare(ticks=1); //2..3...etc.. 

$a = 1; 
if($a < 2){ 
    // $a += 2; 
} 

然後蜱的不同值的不同結果更一致。