PHP类函数声明问题

时间:2013-02-08 15:21:31

标签: php object

我遇到功能重新声明问题。所以,我试图多次调用这个例子。

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()(之前已声明)。

有谁知道如何解决这个问题?

提前致谢。

4 个答案:

答案 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也可以在外部类范围内使用。劳伦斯的解决方案是一种更好的方法。