2015-01-06 3 views
0

Я знаю, что клещей в 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 using Declare ? What is a tick?:

Вы получаете галочку для каждой строки; и каждый блок {}

Не должно быть:

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 

Так что это определенно правило для подсчета tickable заявления для того, чтобы понять, сколько раз выполняется зарегистрированная функция тика? (Я спрашиваю, потому что в этом примере, и потому, что PHP руководство фактически не распространяется на эту тему на счетных tickable статистике)

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 

функция клеща выполняется один раз, но утверждения по крайней мере 2 (если не считать «конец сценария», как @Marc Б указал)

+0

есть также неявный тик «конца скрипта», который является своего рода сортировкой, как '}'. –

+0

Все, что должно иметь смысл, но тогда, если у меня есть 'declare (ticks = 1) echo 'echo
';' Я получаю только функцию обработчика меток, выполняемую только один раз (для оператора 'echo'), а не для «конец скрипта»? – tonix

+1

Я думаю, что 'declare echo;' - это один оператор, так как нет ';', поэтому включение тика не начнется до тех пор, пока ПОСЛЕ завершения инструкции (после выполнения эха) get - это конец скрипта, а не галочка от эха. –

ответ

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

Да, кажется, более надежное решение, пожалуйста, проверьте мое редактирование! – tonix

0

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