Я знаю, какие тики находятся в PHP, но смотрю на вывод следующего кода:
<?php
function myfunc() {
static $n = 1;
print "$n) Tick<br>";
$n++;
}
register_tick_function("myfunc");
declare(ticks=1);
echo 'echo<br>';
Выход:
1) Tick
2) Tick
echo
3) Tick
Он сообщает мне, что зарегистрированная функция tick 'myfunc' выполняется 3 раза. Но, основываясь на этом ответе → PHP, используя Declare? Что такое тик? :
Вы получаете галочку для каждой строки; и каждый блок {}
Не должно быть:
1) Tick
echo
2) Tick
? Поскольку есть только два утверждения:
declare(ticks=1);<-- Statement 1
echo 'echo<br>';<-- Statement 2
Почему 3??? Если я удалю ";" из declare
, например:
declare(ticks=1)
echo 'echo<br>';
Я получаю только одно выполнение зарегистрированной функции тика:
echo
1) Tick
Итак, каково однозначное правило считать тикающие утверждения, чтобы понять, сколько раз выполняется зарегистрированная функция тика? (Я спрашиваю об этом из-за этого примера и потому, что руководство PHP фактически не охватывает тему при подсчете тиков статистики)
EDIT: Еще одно странное поведение, на мой взгляд, таково:
<?php
function myfunc()
{
static $n = 1;
print "$n) Tick<br>";
$n++;
}
register_tick_function("myfunc");
declare(ticks = 1)
echo 'Start<br>';
echo 'echo<br>';
который выводит:
Start
1) Tick
echo
Функция tick выполняется один раз, но операторы не менее 2 (если не считать "конец скрипта", как указывал @Marc B)
что я точно нашел:
function myfunc()
{
static $n = 1;
print "$n) Tick<br>";
$n++;
}
register_tick_function("myfunc");
declare(ticks = 1) {
//echo 'Start<br>';
echo 'echo<br>';
}
выдает 2 тика, один для блока {} и 1 для эха. если вы раскомментируете "Старт", который принесет еще 1 тик, как вы ожидали.
Поэтому я считаю, что наилучшей практикой является всегда использовать
declare(ticks=1) { }
с блочными скобками
Вы не помещаете точку с запятой после declare
, поэтому оператор declare
работает только для следующего оператора (для одного только echo
). Это то же поведение, что и при использовании блока в фигурных скобках после declare
- этот блок затем рассматривается как единственный выполняемый оператор. У вас одинаковые структуры управления: while(true)x();
и while(true){x();y();}
, как раз в случае с declare
точки с запятой после того, как он создает неявный блок вокруг всего оставшегося скрипта.
}
.declare(ticks=1) echo 'echo<br>';
Я получаю только функцию обработчика тиков, выполняемую только один раз (для оператораecho
), а не для «конца сценария»?