代码:
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
四次。我认为$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
,它会打印两次,但它不会。
现在,我不知道它是如何运作的。
答案 0 :(得分: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 =&gt;一个指令,1个刻度=&gt;两条指示。
您的代码的“问题”是您在注册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;
}
然后,不同的滴答值结果更加一致。