PHP 误解了使用 PHP 滴答的可滴答语句的数量?

PHP misunderstanding number of tickable statements using PHP ticks?

我知道 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 using Declare ? What is a tick?:

You get a tick for each line ; and each block {}

不应该是:

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

tick 函数执行一次,但语句至少为 2 个(如果不计算 "end of the script",正如 @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 个用于回显。 如果您取消注释 'Start' 这将如您所料带来 1 个滴答声。

所以我认为最好的做法是始终使用

declare(ticks=1) { } 

带方括号

您没有在 declare 之后放置分号,因此您的 declare 语句仅适用于下一条语句(仅适用于一个 echo)。这与在 declare 之后使用大括号中的块是相同的行为 - 然后该块被视为唯一要执行的语句。您对控制结构有相同的看法:while(true)x();while(true){x();y();},只是在 declare 分号的情况下,它在所有剩余的脚本周围创建了一个隐式块。