2

您可以通过搜索例如 PHPAPI(stream_copy_to_stream) 来查找内置函数,并在 ext/standard/streamsfuncs.c 中找到实现。

如何为 echo 这样的语言结构做到这一点?

我发现它与 Zend/zend_language_parser.y 中的 T_ECHO 相关联,但无法从那里追踪它是如何工作的。

Zend Engine 在哪里实现回显功能?

4

1 回答 1

0

鉴于此示例程序:

<?php echo 'Hello world!';

我们可以像这样获取程序编译成的操作码:

$ phpdbg7.4 -p /tmp/hello.php
function name: (null)
L1-2 {main}() /tmp/hello.php - 0x7fef35ea1000 + 3 ops
 L1    #0     EXT_STMT                                                                              
 L1    #1     ECHO                    "Hello world!"                                                
 L2    #2     RETURN<-1>              1

如您所见,回显是使用单独的 VM 指令处理的:ZEND_ECHO。每个操作码的处理程序在Zend/zend_vm_def.h中定义。搜索“ZEND_ECHO”。

于 2021-01-19T14:59:31.530 回答