объявлять — PHP неправильно понимает количество помеченных операторов с помощью отметок PHP?

Я знаю, что такое тики в 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)

0

Решение

что я точно нашел, это:

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) { }

с кронштейнами

1

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

Вы не ставите точку с запятой после declare, Так что ваши declare оператор работает только для следующего оператора (только для одного echo). Это то же самое поведение, что и при использовании блока в фигурных скобках после declare — этот блок считается единственным оператором для выполнения. У вас так же с управляющими структурами: while(true)x(); а также while(true){x();y();}, только в случае с declare точка с запятой после него создает неявный блок вокруг всего оставшегося скрипта.

0

По вопросам рекламы [email protected]