以免假设我有以下内容
function a(){
function b(){}
}
a(); //pass
a(); //error
为什么在第二次调用中抛出异常并说
cannot re-declare function b()
我认为每个函数调用都会创建一个新的活动记录,其中包含自己的作用域;就像在其他语言中一样,当我们在一个函数中声明一个变量并调用该函数时,所有变量在其范围内都是活的,为什么内部函数不一样?
命名函数在 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()
,在a()
之外声明b()
,并从内部调用b()
a()
如下所示:
function a() {
b();
}
function b() {}
a();
a();
在另一个函数中声明一个函数在 php 中会被认为是不好的做法。如果你真的需要在a()中有一个函数,你应该创建一个闭包。
function a() {
$b = function() {
};
}
这是因为
您在全局范围内调用a()
。添加一个function_exists
调用以使上面的代码正常工作,但实际上很少有场景真正应该做这样的事情。