我有一个函数重新声明问题。所以,我试着多次调用这个例子。
class myClass {
function abc() {
function internal() {
return "i am internal";
}
return internal();
}
}
$myClass = new myClass();
echo $myClass->abc();
echo $myClass->abc(); // HERE IS THE PROBLEM when i call same function second time
PHP显示致命错误:无法重新声明internal()(以前声明过)。
有人知道我该怎么解决这个问题吗?
提前谢谢。
您不能重新声明函数周期,所以请尝试以下操作:
<?php
class myClass {
function abc() {
return $this->internal();
}
private function internal() {
return "i am internal";
}
}
?>
当您使用function <name>()
声明函数时,您不是在您认为的范围内声明它。该函数是在class全局作用域中声明的,而不是在函数/类作用域中。
请参阅PHP文档:http://www.php.net/manual/en/functions.user-defined.php#example-149
因此,当您调用abc
时,您正在重新声明全局函数internal
。
如果你想做你正在做的事情,你可以使用闭包(注意:这只适用于PHP 5.3+)。这有一个好处,那就是可以从abc
中读取局部变量(如果你使用use
关键字)。
class myClass {
function abc() {
$internal = function() {
return "i am internal";
};
return $internal();
}
}
您还可以将internal
声明为类的私有函数,尤其是在它不会更改的情况下。为什么要不断地重新制作一个函数?
class myClass {
private function internal(){
return "i am internal";
}
function abc() {
return $this->internal();
}
}
在定义函数之前检查函数是否存在:
class myClass {
function abc() {
if ( ! function_exists('internal')) {
function internal() {
return "i am internal";
}
}
return internal();
}
}
或者:
if (!function_exists('internal')) { function internal ... }
但是,您必须注意,在这种情况下,函数internal也将在类作用域之外可用。劳伦斯的解决方案是一个更好的方法。