您好,欢迎访问一九零五行业门户网

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

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 '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
产生三个疑问:
(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); } '(' parameter_list ')' '{' inner_statement_list '}' { zend_do_end_function_declaration(&$1tsrmls_cc); } ;
可以知道function_declaration_statement是完整的函数声明,也就是说,一个函数的定义包括完整的函数原形及函数体算一条function_declaration_statement。 
以上就是php控制结构语句declare中tick的用法详解的详细内容。
其它类似信息

推荐信息