摘要:declare是PHP的流程控制結構,directive目前支持兩個指令【ticks和encoding】,ticks的使用需配合register_tick_function函數(當然還有unregis...
declare是PHP的流程控制結構,directive目前支持兩個指令【ticks和encoding】,ticks的使用需配合register_tick_function函數(當然還有unregister_tick_function函數)使用。
declare 結構用來設定一段代碼的執行指令。declare 的語法和其它流程控制結構相似:
declare (directive) statement
directive 部分允許設定 declare 代碼段的行為。目前只認識兩個指令:ticks以及 encoding。
ticks 指令在 PHP 5.3.0 中是過時指令,將會從 PHP 6.0.0 移除。
encoding 是 PHP 5.3.0 新增指令。
Tick 是一個在 declare 代碼段中解釋器每執行 N 條低級語句就會發生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 來指定的。
在每個 tick 中出現的事件是由 register_tick_function() 來指定的。注意每個 tick 中可以出現多個事件。
不懂?通俗解釋如下:
ticks參數表示運行多少語句調用一次register_tick_function的函數。
register_tick_function函數定義了每個tick事件發生時的處理函數。那么什么是tick事件呢?
tick是一個事件,tick事件在PHP每執行N條低級語句就發生一次,N由declare語句指定。
可以用register_tick_function()來指定tick事件發生時應該執行的操作。
問題又來了, 什么是低級語句呢?它包括:
(1) 簡單語句:空語句(就一個;號),return,break,continue,throw, goto,global,static,unset,echo, 內置的HTML文本,分號結束的表達式等均算一個語句。
(2) 復合語句:完整的if/elseif,while,do...while,for,foreach,switch,try...catch等算一個語句。
(3) 語句塊:{} 括出來的語句塊。
(4) 最后特別的:declare塊本身也算一個語句(按道理declare塊也算是復合語句,但此處特意將其獨立出來)。
看一個簡單的例子:
<?php function doticks (){ echo 'ticks'; } register_tick_function('doticks'); declare(ticks = 1) { for ($x = 1; $x < 10; $x++) { echo $x * $x . '<br />'; } }
運行結果:
1 ticksticks4 ticksticks9 ticksticks16 ticksticks25 ticksticks36 ticksticks49 ticksticks64 ticksticks81 ticksticksticksticks
現在再來看例子就比較好理解了:
首先完整的for循環算一個語句,但必須要等循環結束才算,因此在編譯時for循環里面的echo 算第一個語句。
所以第一個doticks是在第一個echo后執行的,也就是1輸出后才發生第一個tick事件。
在$x 從1到9的循環中,每個循環包括兩個語句,一個echo, 一個for循環。在81輸出后,因為echo是一條語句,因此輸出第一個ticks。
同時$x=9的這個for循環也結束了,這又是一條語句,輸出第二個ticks;開始$x=10的循環,但這時已不滿足循環條件,for循環執行結束,這個循環又是一個語句,這時輸出第三個ticks。
最后declare本身也算一條語句,所以又輸出第四個ticks。