看起来PHP通常需要在使用之前定义嵌套函数。但是使用require
动态构建的代码没有相同的限制。任何人都可以解释为什么不一致吗?
编辑:只是为了澄清,我想要理解的是:为什么示例2工作而不是像示例1那样失败?
如果这是文件nested1.php
的内容:
<?php
function outer() {
inner();
function inner() {
print "Hello world.\n";
}
}
outer();
?>
使用php nested1.php
运行此命令会返回:
PHP Fatal error: Call to undefined function inner() in nested1.php on line 3
但是,如果您将inner()
函数调用移到函数定义下面,如下所示:
<?php
function outer() {
function inner() {
print "Hello world.\n";
}
inner();
}
outer();
?>
再次运行你得到:
Hello world.
如果这是nested2.php
的内容:
<?php
function outer() {
require "inner.php";
}
outer();
?>
这是inner.php
:
<?php
inner();
function inner() {
print "Hello world.\n";
}
?>
使用php nested2.php
运行此命令会返回:
Hello world.
答案 0 :(得分:3)
第一次调用outer()
函数时,其中的inner()
函数将在全局范围内声明。
function outer() {
function inner() {
print "Hello world.\n";
}
inner();
}
outer();
outer();//Second call
因此,您将收到以下错误:
Fatal error: Cannot redeclare inner()
因为对outer()
的第二次调用试图重新声明inner()
函数。
为了避免此问题,您需要使用如下的匿名函数声明:
function outer() {
$inner = function () {
print "Hello world.\n";
};
$inner();
}
outer();
outer();
在这种情况下$inner
仅在本地函数“外部”范围内可用
答案 1 :(得分:2)
示例1:
PHP does not support nested functions. It only supports inner functions.
Nested function reference
<?php
function outer() {
inner();
function inner() {
print "Hello world.\n";
}
}
outer();
示例2: In this function you are just requiring file which includes and evaluates the scripts.
Reference
<?php
function outer() {
require "inner.php";
}
outer();
?>
<?php
inner();
function inner() {
print "Hello world.\n";
}
?>
答案 2 :(得分:0)
在你的第一个例子中,你试图在另一个函数中定义一个新函数,但php不允许嵌套函数。做这样的事情会很好:
<?php
function outer() {
inner();
}
outer();
function inner() {
print "Hello world.\n";
}
?>
在第二个示例中,您要包含一个文件。由于您没有在inner.php中使用嵌套函数,因此代码按预期工作。