PHP如何解析函数

PHP如何解析函数,php,php-internals,Php,Php Internals,在解析PHP文件时,我被PHP的行为弄糊涂了。我一直在读这篇文章 PHP语言被解释 所以我有密码 var_dump(function_exists('abc')); exit; function abc() { return; } 根据我的假设,var\u dump应该打印false,但它打印bool(true) 有人能帮我理解这种行为吗?请参见 简言之,它在运行时被编译成一种字节码,然后进行解释——这样做,您就可以获得函数的定义,即使它们出现在最后。将检查函数名的已定义函数列表,包括

在解析PHP文件时,我被PHP的行为弄糊涂了。我一直在读这篇文章

PHP语言被解释

所以我有密码

var_dump(function_exists('abc')); exit;
function abc() {
    return;
}
根据我的假设,
var\u dump
应该打印
false
,但它打印
bool(true)

有人能帮我理解这种行为吗?

请参见


简言之,它在运行时被编译成一种字节码,然后进行解释——这样做,您就可以获得函数的定义,即使它们出现在最后。

将检查函数名的已定义函数列表,包括内置(内部)函数和用户定义函数。因此,php解释器检查具有名称的函数是否在解释前编译的字节码中定义

它是在运行前预编译的,而不是在运行时进行解释AFAIK@RST函数abc()的任何引用或链接在退出之前被调用;(使用函数_exists)这就是它返回“true”的原因。即使您在退出后定义函数并在退出前调用它,它仍然会执行。我的意思是,使用函数_exists(),调用函数abc(),因为它搜索某个函数是否存在。您在这里看到的通常称为“函数提升”。函数的非条件定义被“提升”到脚本的顶部。好吧,那么最后PHP不仅仅是按照人们说的那样解释的?是的,但是代码必须被转换成解释器可读的东西,这种字节码形式让你的代码为解释器优化。这很有意义。谢谢你,马特。