【问题标题】:PHP misunderstanding number of tickable statements using PHP ticks?PHP 误解了使用 PHP 滴答的可滴答语句数?
【发布时间】:2015-01-06 20:05:19
【问题描述】:

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

每行都有一个勾号;以及每个区块{}

不应该是:

1) Tick
echo
2) Tick

?因为只有两个语句:

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

为什么是 3???如果我删除“;”来自declare,像这样:

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

我得到了注册tick函数的唯一一次执行:

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 条(如果不计算 @Marc B 指出的“脚本结束”)

【问题讨论】:

  • 还有“脚本结束”的隐含标记,有点像}
  • 好吧,这应该是有道理的,但是为什么如果我有 declare(ticks=1) echo 'echo&lt;br&gt;'; 我只执行一次刻度处理函数(对于 echo 语句)而不是“脚本结束” “?
  • 我猜declare echo;是一个单独的语句,因为没有;,所以直到语句完成之后(执行回显之后)才开始启用刻度,所以你得到的单个滴答声是脚本的结尾,而不是回声中的滴答声。
  • 即使这样也有道理,但是如果你说 declare 不被算作,在第一个执行 3 次滴答乐趣的脚本中(一个用于声明、回显和“结束脚本”)它应该只执行 2 (不用于声明)...

标签: php declare


【解决方案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) { } 

带方括号

【讨论】:

  • 是的,这似乎是更可靠的解决方案,请检查我的编辑!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多