PHP类函数声明问题


PHP Class function declaration issue

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

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也将在类作用域之外可用。劳伦斯的解决方案是一个更好的方法。