这里阅读的php版本为PHP-7.1.0 RC3,阅读代码的平台为linux

回到之前看的zend_eval_stringl

ZEND_API int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr, char *string_name) /* {{{ */
{
...
new_op_array = zend_compile_string(&pv, string_name); // 这个是把php代码编译成为opcode的过程
...
zend_execute(new_op_array, &local_retval); // 这个是具体的执行过程,执行opcode,把结果存储到local_retval中
...
retval = SUCCESS;
return retval;
}

这里的zend_execute执行了两步,第一步是把php编译解析成为opcode的过程,我们就先看这个。

zend_compile_string

zend_compile_string函数追下去可以追到compile_string

// 将一个字符串解析成为op_array
zend_op_array *compile_string(zval *source_string, char *filename)
{
zend_lex_state original_lex_state;
zend_op_array *op_array = NULL;
zval tmp; // 如果传进来要解析的字符为空,则返回null
if (Z_STRLEN_P(source_string)==0) {
return NULL;
} ZVAL_DUP(&tmp, source_string); // 复制source_string到zval中
convert_to_string(&tmp); // 如果不是字符类型就转换为字符类型
source_string = &tmp; zend_save_lexical_state(&original_lex_state); // 保存lex上下文
if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) { // 做编译前的准备
BEGIN(ST_IN_SCRIPTING); // 设置状态为正在编译
op_array = zend_compile(ZEND_EVAL_CODE); // 进行编译,并把生成结果放在op_array中
} zend_restore_lexical_state(&original_lex_state); // 恢复lex上下文
zval_dtor(&tmp); // 释放tmp return op_array;
}

里面最核心的就是zend_compile了。这里的几个点可以看看:

1 这么做类型转换,参考convert_to_string。这个函数就是把任意类型的值转换为zval的string类型。

2 zval_dtor,这个函数是能把任意的zval变量做回收。非常好用。

3 ZVAL_DUP,是进行复制,它和ZVAL_COPY的区别在于是否增加gc的引用计数。

下面又找到关键点:zend_compile

最新文章

  1. C#事件的理解应用
  2. iOS 向客户发送xcarchive文件(整理中)
  3. LoadRunner编程之跳出迭代【exit(-1)和return 0】
  4. 田渊栋:AlphaGo系统即使在单机上也有职业水平
  5. REUSE_ALV_GRID_DISPLAY显示ALV,设置可编辑时,与内表数据同步问题
  6. [转载] [Mark]分布式存储必读论文
  7. 【MySQL】MySQL同步报错-> received end packet from server, apparent master shutdown: Slave I/O thread: Failed reading log event, reconnecting to retry报错解决和分析
  8. Android开源项目发现---ProgressBar 篇(持续更新)
  9. Mac、Linux与Windows
  10. Atom package安装失败的解决方案
  11. Spark源码阅读@ListenerBus 的实现
  12. Python基础(四)-集合
  13. Mybatis Dynamic Query 2.0.2
  14. Mybatis配置文件SqlMapConfig.xml中的标签
  15. Class的isAssignableFrom方法
  16. 《超哥带你学Linux》
  17. 20169207《Linux内核原理及分析》第十二周作业
  18. 一不小心发现了个Asp.Net Bug
  19. Intellij IDEA调试功能总结
  20. JavaScript互斥锁案例

热门文章

  1. Redis/HBase/Tair比较
  2. 初学者看过来之JSON入门
  3. jquery.cookie的使用
  4. Mybatis批量删除
  5. Android中Fragment与Activity之间的交互(两种实现方式)
  6. Spring Quartz实现任务调度
  7. Linux配置防火墙 开启80端口的方法
  8. 解决托管在Windows上的Stash的Pull request无法合并的问题
  9. 打造TypeScript的Visual Studio Code开发环境
  10. 抛弃jQuery:DOM API之操作元素