PHP,编译 foreach 和 opline

Jes*_*Hun 5 php arrays compiler-construction php-internals

我试图弄清楚 PHP 如何解释 foreach 语句。这导致我gdb在执行虚拟 foreach 脚本时使用。

我最终在zend_compile_foreach()函数中的 zend_compile.c 中。我看到对宏 ZEND_FE_FETCH_R 的调用移动了我们循环的数组/对象的内部指针。

有几件事我不明白:

  • 值如何实际返回到zend_compile_foreach上下文
  • 我们是否嵌套调用zend_compile_stmt(因此zend_compile_foreach)以进行迭代?那么代码编译 N 次了吗?N 是数组/对象中的元素数
  • 什么是opline??我到处都看到,但我不知道这一点