以免假设我有以下
function a(){
function b(){}
}
a(); //pass
a(); //error
为什么在第二次调用中抛出异常并且它说
cannot re-declare function b()
我认为每个函数调用都会创建一个包含自己范围的新活动记录;就像在 PHP 以外的其他语言中一样,当我们在函数中声明一个变量并调用该函数时,所有变量在它们的范围内都是有效的,为什么内部函数不一样?
以免假设我有以下
function a(){
function b(){}
}
a(); //pass
a(); //error
为什么在第二次调用中抛出异常并且它说
cannot re-declare function b()
我认为每个函数调用都会创建一个包含自己范围的新活动记录;就像在 PHP 以外的其他语言中一样,当我们在函数中声明一个变量并调用该函数时,所有变量在它们的范围内都是有效的,为什么内部函数不一样?
命名函数在 PHP 中总是全局的。因此,您需要检查函数 B 是否已经创建:
function A() {
if (!function_exists('B')) {
function B() {}
}
B();
}
另一种解决方案是使用匿名函数(这更可能满足您的需求,因为该函数现在存储在一个变量中,因此在 A 的函数范围内是本地的):
function A() {
$B = function() {};
$B();
}
这是因为当你执行函数时a
,它声明了函数 b。再次执行它会重新声明它。您可以使用function_exists
函数来解决此问题。
function a(){
if(!function_exists('b')){
function b(){}
}
}
但我的建议是,你应该在外面声明这个函数。不在里面。
这正是所说的,当您a()
再次调用时,它会尝试重新声明b()
,b()
在外部声明并从内部a()
调用,如下所示:b()
a()
function a() {
b();
}
function b() {}
a();
a();
像这样在另一个函数中声明一个函数将被认为是 php 中的不良做法。如果你真的需要 a() 中的函数,你应该创建一个闭包。
function a() {
$b = function() {
};
}
这是因为您a()
在全局范围内调用。添加一个function_exists
调用以使上述代码工作,但实际上很少有场景你应该真正做这样的事情。