PHP неправильно понимает количество помеченных операторов, использующих тики PHP?

0

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

  • 0
    есть также неявный тик «конец скрипта», который вроде своего рода } .
  • 0
    Хорошо, это должно иметь смысл, но тогда почему, если я declare(ticks=1) echo 'echo<br>'; Я получаю только функцию обработчика тиков, выполняемую только один раз (для оператора echo ), а не для «конца сценария»?
Показать ещё 2 комментария
Теги:
declare

2 ответа

1
Лучший ответ

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

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

с блочными скобками

  • 0
    Да, похоже, более надежное решение, пожалуйста, проверьте мои изменения!
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню