Код:
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
, он напечатает два раза, но это не так.
Теперь я не знаю, как это работает。
Попробуйте запустить этот код, увеличить тики и запустить снова, от 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 галочкой => одну инструкцию, 1 галочкой => две инструкции.
«Проблема» с вашим кодом заключается в том, что вы устанавливаете номер тиков ДО регистрации регистратора тиков, а затем пропускается один вызов, потому что функция не была зарегистрирована. На самом деле, звонок поступает во время регистрации тикового обработчика. Если вы начнете считать тики после объявления
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;
}
тогда разные результаты с разными значениями для тиков являются более связными.
Других решений пока нет …