【问题标题】:How declare structure work in php声明结构如何在 php 中工作
【发布时间】:2015-09-18 10:57:44
【问题描述】:

代码:

declare(ticks=1);

function tick_handler(){
    echo "tick_handler() called\n";
}

register_tick_function('tick_handler');
$a = 1;
if($a < 2){
    // $a += 2;
}

当我运行这段代码时,它会打印四次tick_handler() called。我认为$a = 1 会打印一次tick_handler() called,但为什么会打印四次。 如果我更改第一行代码:

declare(ticks = 2)

它将像以前一样打印相同的结果。 在php文档中,它说:

A tick is an event that occurs for every N low-level tickable statements executed by the parser within the declare block

所以我认为如果ticks = 2,它会打印两次,但事实并非如此。 现在,我不知道它是如何工作的。

【问题讨论】:

    标签: php declare


    【解决方案1】:

    考虑运行这段代码,增加刻度并再次运行,从 1 到 10(或多或少),然后也许你会明白它是如何工作的。

    declare(ticks=1);
    function tick_handler(){
        echo "tick_handler() called<br>";
    }
    echo("1<br>");
    register_tick_function('tick_handler');
    echo("2<br>");
    $a = 1;
    echo("3<br>");
    if($a < 2){
        echo("4<br>");
        // $a += 2;
    }
    echo("5<br>");
    

    我将其解释为:每 N 个“滴答”(这可能是 PHP 必须测量其内部指令以运行单个高级调用(如打印)的一种深奥方式)调用此函数。您不能使等价 2 滴答 => 一条指令,1 滴答 => 两条指令。

    您的代码的“问题”是您在注册滴答处理程序之前设置了滴答数,然后由于尚未注册该函数而错过了一个呼叫。实际上,调用是在刻度处理程序的注册期间发出的。如果您在声明后开始计算滴答声

    function tick_handler(){
        echo "tick_handler() called<br>";
    }
    
    register_tick_function('tick_handler');
    declare(ticks=1);  //2..3...etc..
    
    $a = 1;
    if($a < 2){
        // $a += 2;
    }
    

    那么不同刻度值的不同结果会更加连贯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 2021-03-10
      • 1970-01-01
      相关资源
      最近更新 更多