PHP中先调用未定义嵌套自定义函数及条件定义函数报错咨询
嵌套自定义函数先调用后定义的报错问题
好问题!咱们得先理清PHP处理不同函数定义的底层逻辑,才能搞明白嵌套函数的调用规则:
首先,PHP对全局非条件定义的普通函数,是在脚本执行前的编译解析阶段就完成注册的,所以哪怕你先调用再写函数定义,也不会报错——这也是你提到的常规情况。
但嵌套函数和条件定义的函数一样,都属于运行时动态定义的范畴:
- 条件定义的函数,只有当代码执行到对应的条件分支(比如
if成立)时,函数才会被注册到全局; - 嵌套函数则是只有当它所在的外部函数被执行时,才会被定义出来(而且嵌套函数默认是全局的,不是外部函数的局部函数,这点要注意)。
所以回到你的问题:如果先调用嵌套函数,再执行包含它的外部函数,一定会触发和条件定义函数一样的致命错误,因为调用时该函数还未被注册。
举个错误示例:
bar(); // 此时bar还没被定义,直接报错 foo(); function foo() { function bar() { echo "I'm a nested function!"; } }
运行这段代码会抛出:Fatal error: Uncaught Error: Call to undefined function bar()
而如果调整顺序,先执行外部函数再调用嵌套函数,就完全没问题:
foo(); // 执行foo,此时bar被注册到全局 bar(); // 正常调用 function foo() { function bar() { echo "I'm a nested function!"; } }
总结一下:嵌套函数的定义时机是外部函数执行时,而非脚本解析阶段,这和条件定义函数的规则完全一致。只要在函数被定义(也就是外部函数执行完成)之前调用它,就会触发未定义函数的致命错误。
内容的提问来源于stack exchange,提问作者revo
相关产品推荐
相关产品推荐

