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
分号的情况下,它在所有剩余的脚本周围创建了一个隐式块。
我知道 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
分号的情况下,它在所有剩余的脚本周围创建了一个隐式块。