Я знаю, что такое тики в 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
Это говорит мне, что зарегистрированная функция тика ‘myfunc’ выполняется 3 раза. Но, исходя из этого ответа -> PHP с помощью объявления? Что такое галочка?:
Вы получаете галочку для каждой строки; и каждый блок {}
Не должно ли это быть:
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 на самом деле не охватывает тему подсчета отмеченной статистики)
РЕДАКТИРОВАТЬ: Другое странное поведение на мой взгляд, это:
<?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
Тиковая функция выполняется один раз, но операторов по крайней мере 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
точка с запятой после него создает неявный блок вокруг всего оставшегося скрипта.