2

我对函数重新声明问题有疑问。所以,我试图多次调用这个例子。

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

4 回答 4

5

您不能重新声明函数周期,因此请尝试以下操作:

<?php 
class myClass {

    function abc() {
        return $this->internal();
    }

    private function internal() {
        return "i am internal";
    }

}
?>
于 2013-02-08T15:24:14.133 回答
1

在定义函数之前检查函数是否存在:

class myClass {
    function abc() {
        if ( ! function_exists('internal')) {
            function internal() {
                return "i am internal"; 
            }
        }

        return internal();
    }
}
于 2013-02-08T15:24:55.007 回答
1

当您使用 声明一个函数时function <name>(),您并没有在您认为的范围内声明它。该函数是在全局范围内声明的,而不是在函数/类范围内。

请参阅 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();
    }
}
于 2013-02-08T15:28:59.753 回答
0

或者:

if (!function_exists('internal')) { function internal ... }

但是,您必须注意,在这种情况下,内部函数也将在类范围之外可用。Lawrence 的解决方案是一种更好的方法。

于 2013-02-08T15:24:44.307 回答