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

时间:2015-01-06 20:05:20

标签: php declare

我知道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

它告诉我注册的滴答功能&#39; myfunc&#39;执行3次。但是,基于这个答案 - &gt; PHP using Declare ? What is a tick?

  

每行都有一个勾号;和每个块{}

不应该是:

1) Tick
echo
2) Tick

?因为只有两个语句:

declare(ticks=1);<-- Statement 1
        echo 'echo<br>';<-- Statement 2

为什么3 ???如果我删除&#34 ;;&#34;来自declare,像这样:

declare(ticks=1)
        echo 'echo<br>';

我只获得了一个注册的tick功能:

echo
1) Tick

那么,为了理解注册的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(如果不计算&#34;脚本结束&#34;正如@Marc B指出的那样)

2 个答案:

答案 0 :(得分: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个滴答,一个用于块{},一个用于回声。 如果你取消评论&#39;开始&#39; 这将带来你预期的1个滴答。

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

declare(ticks=1) { } 

带方括号

答案 1 :(得分:0)

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