我遇到功能重新声明问题。所以,我试图多次调用这个例子。
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()(之前已声明)。
有谁知道如何解决这个问题?
提前致谢。
答案 0 :(得分:5)
您无法重新声明功能期限,请尝试以下操作:
<?php
class myClass {
function abc() {
return $this->internal();
}
private function internal() {
return "i am internal";
}
}
?>
答案 1 :(得分:1)
在定义函数之前检查函数是否存在:
class myClass {
function abc() {
if ( ! function_exists('internal')) {
function internal() {
return "i am internal";
}
}
return internal();
}
}
答案 2 :(得分:1)
当您使用function <name>()
声明某个功能时,您不在您认为自己的范围内声明它。该函数在类全局范围内声明,而不是函数/类范围。
请参阅PHP文档:http://www.php.net/manual/en/functions.user-defined.php#example-149
因此,当您致电abc
时,您将重新声明全局函数internal
。
如果你想做你正在做的事情,你可以改用closures(注意:这只适用于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();
}
}
答案 3 :(得分:0)
可替换地:
if (!function_exists('internal')) { function internal ... }
但是,您必须注意,在这种情况下,函数internal也可以在外部类范围内使用。劳伦斯的解决方案是一种更好的方法。