登录  /  注册

php控制结构语句declare中tick的用法详解

伊谢尔伦
发布: 2017-06-24 15:27:17
原创
1434人浏览过

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

directive 部分允许设定 declare 代码段的行为。目前只认识两个指令:ticks(更多信息见下面 ticks 指令)以及encoding(更多信息见下面 encoding指令)。

Note: 

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 中可以出现多个事件。

看完手册还是觉得云里雾里,再看看别人是怎么描述:

根据代码解析:

<?php    
    function doTicks ()    
    {    
        echo &#39;Ticks&#39;;    
    }    
    register_tick_function(&#39;doTicks&#39;);    
    declare(ticks = 1) {    
        for ($x = 1; $x < 10; ++ $x) {    
            echo $x * $x . &#39;<br />&#39;;    
        }    
    }    
 ?>
登录后复制

运算结果:

1    
TicksTicks4    
TicksTicks9    
TicksTicks16    
TicksTicks25    
TicksTicks36    
TicksTicks49    
TicksTicks64    
TicksTicks81    
TicksTicksTicksTicks
登录后复制

产生三个疑问:

(1)为什么先输出1之后才输出“Ticks”?

(2)为什么在输出81后还输出四个Ticks ?

(3)declare中的for循环怎么分解成低级语句(low-level)?

这是每个初次接触ticks的人都会碰到的问题。首先register_tick_function函数定义了每个tick事件发生时的处理函数。那么什么是tick事件呢?

有三层意思:

(1) tick是一个事件。

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

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

很明显,理解上面的输出结果最关键的是了解什么是低级语句(low-level statements),它又是如何进行计数的。我们首先还是将上面的程序通过OPDUMP编译成OPCODEs:

很明显,PHP的编译过程已经在编译后每条语句的OPCODE序列中插入了TICKS指令用于处理tick事件。那么这些TICKS是根据什么规则来插入的呢?

我们还是从PHP Zend Engine的源代码中寻找答案。

通过简单的文本搜索我们可以知道生成ZEND_TICKS指令的唯一函数是zend_do_ticks(该函数的实现在zend_compile.c中)。

现在再从PHP的语法分析文件zend_language_parser.y(PHP使用bison来做语法分析,所有的语法规则均定义在zend_language_parser.y中)中寻找调用zend_do_ticks的地方。

再一次使用简单的文本搜索,我们可以得到调用zend_do_ticks的三条语法规则:

statement:    
unticked_statement { zend_do_ticks(TSRMLS_C); }    
 | ...    
 ;    
function_declaration_statement:    
unticked_function_declaration_statement { zend_do_ticks(TSRMLS_C); }    
 ;    
class_declaration_statement:    
unticked_class_declaration_statement { zend_do_ticks(TSRMLS_C); }    
 ;
登录后复制

也就是说,PHP编译会在statement(语句), function_declaration_statement(函数定义语句), class_declaration_statement后插入TICKS处理函数,即它会在每条statement,函数声明,类(实际上还包括接口)声明后插入一条TICKS指令。

函数与类声明语句比较好理解,根据unticked_function_declaration_statement的语法定义:

unticked_function_declaration_statement:    
function is_reference T_STRING { zend_do_begin_function_declaration(&$1, &$3, 0, $2.op_type, NULL TSRMLS_CC); }    
 &#39;(&#39; parameter_list &#39;)&#39; &#39;{&#39; inner_statement_list &#39;}&#39; { zend_do_end_function_declaration(&$1TSRMLS_CC); }    
;
登录后复制

 可以知道function_declaration_statement是完整的函数声明,也就是说,一个函数的定义包括完整的函数原形及函数体算一条function_declaration_statement。 

以上就是php控制结构语句declare中tick的用法详解的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号