Как объявить работу структуры в Stack Overflow

Код:

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

Решение

Попробуйте запустить этот код, увеличить тики и запустить снова, от 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;
}

тогда разные результаты с разными значениями для тиков являются более связными.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector