php函数:declare与register_tick_function(一)

袁志蒙 3973次浏览

摘要:declare是PHP的流程控制结构,directive目前支持两个指令【ticks和encoding】,ticks的使用需配合register_tick_function函数(当然还有unregis...

declare是PHP的流程控制结构,directive目前支持两个指令【ticks和encoding】,ticks的使用需配合register_tick_function函数(当然还有unregister_tick_function函数)使用。


declare 结构用来设定一段代码的执行指令。declare 的语法和其它流程控制结构相似:

    declare (directive)
    statement

directive 部分允许设定 declare 代码段的行为。目前只认识两个指令:ticks以及 encoding。


ticks 指令在 PHP 5.3.0 中是过时指令,将会从 PHP 6.0.0 移除。

encoding 是 PHP 5.3.0 新增指令。

Tick 是一个在 declare 代码段中解释器每执行 N 条低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的。

在每个 tick 中出现的事件是由 register_tick_function() 来指定的。注意每个 tick 中可以出现多个事件。


不懂?通俗解释如下:

ticks参数表示运行多少语句调用一次register_tick_function的函数。

register_tick_function函数定义了每个tick事件发生时的处理函数。那么什么是tick事件呢?

tick是一个事件,tick事件在PHP每执行N条低级语句就发生一次,N由declare语句指定。

可以用register_tick_function()来指定tick事件发生时应该执行的操作。


问题又来了, 什么是低级语句呢?它包括:

(1) 简单语句:空语句(就一个;号),return,break,continue,throw, goto,global,static,unset,echo, 内置的HTML文本,分号结束的表达式等均算一个语句。

(2) 复合语句:完整的if/elseif,while,do...while,for,foreach,switch,try...catch等算一个语句。

(3) 语句块:{} 括出来的语句块。

(4) 最后特别的:declare块本身也算一个语句(按道理declare块也算是复合语句,但此处特意将其独立出来)。


看一个简单的例子:


<?php
function doticks (){
    echo 'ticks';
}

register_tick_function('doticks');

declare(ticks = 1) {
    for ($x = 1; $x < 10; $x++) {
        echo  $x * $x . '<br />';
    }
}

运行结果:

1
ticksticks4
ticksticks9
ticksticks16
ticksticks25
ticksticks36
ticksticks49
ticksticks64
ticksticks81
ticksticksticksticks

现在再来看例子就比较好理解了:

首先完整的for循环算一个语句,但必须要等循环结束才算,因此在编译时for循环里面的echo 算第一个语句。
所以第一个doticks是在第一个echo后执行的,也就是1输出后才发生第一个tick事件。
在$x 从1到9的循环中,每个循环包括两个语句,一个echo, 一个for循环。在81输出后,因为echo是一条语句,因此输出第一个ticks。
同时$x=9的这个for循环也结束了,这又是一条语句,输出第二个ticks;开始$x=10的循环,但这时已不满足循环条件,for循环执行结束,这个循环又是一个语句,这时输出第三个ticks。
最后declare本身也算一条语句,所以又输出第四个ticks。

随机内容

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~