echo,这个是PHP运用得最多的标记之一,算不上是函数,PHP手册里这么写的,因为它没有返回值。今天好奇就去看看PHP的源代码,因为echo不是一般的函数,所以找起来比较费劲,一般的函数只要搜索PHP_FUNCTION(fun_name)基本就能找着函数的实现方式,但是PHP是一门脚本语言,所以的符号都会先经过词法解析和语法解析阶段,这两个阶段是由lexyacc实现的。
对应的文件在php_source/Zend/目录下面的zend_language_parser.y及zend_language_scanner.l
首先看zend_language_scanner.l文件,行:
ST_IN_SCRIPTING“echo”{returnT_ECHO;}
ZEND引擎在读取一个PHP文件之后会先进行词法分析,就是用lex扫描,把对应的PHP字符转换成相应的标记(也叫token),比如你echo$a;在碰到这句首先会匹配到echo,符合上面的规则,然后就返回一个T_ECHO标记,这个在后面的语法分析会用上,也就是在zend_language_parser.y文件中:unticked_statement:。。。。中间有省略
T_GLOBALglobal_var_list‘;’
T_STATICstatic_var_list‘;’
T_ECHOecho_expr_list‘;’
T_INLINE_HTML{zend_do_echo($1TSRMLS_CC);}看到了T_ECHO,后面跟着echo_expr_list,再搜这个字符串,找到:echo_expr_list:echo_expr_list‘,’expr{zend_do_echo($3TSRMLS_CC);}//第1行,
expr{zend_do_echo($1TSRMLS_CC);}//第2行对于第1行就像echo$var_1,$var_2,执行动作就是zend_do_echo()函数,在Zend/目录下面搜索一下这个函数,就能知道这个函数是在zend_