2

好的,所以这已经烤了我的面条一段时间了。我有一个类,它的方法定义了一个全局可访问的函数。我的问题是:内部类方法如何定义可在全局范围内访问的函数?

这是一个示例:

class MyClass 
{

    // ... accessors, constuctors other methods, et al... 

    // The method in question:
    private function myPrivateMethod()
    {
        if( !function_exists( 'someArbitraryFunction' ) )
        {
            function someArbitraryFunction( $args )
            {
                return "Hello, {$args} world!";
            }
        }            
    } 
}

该类像往常一样在应用程序的早期实例化,但它是在另一个类的方法中实例化的。这是一个浅范围链,但嵌套得足够多,以至于(对我而言)它为什么可以在应用程序之外访问是没有意义的。这违背了我对封装的理解,一些见解将不胜感激。

4

1 回答 1

3

声明的函数将始终具有全局范围。这不是 JavaScript。

看:

class MyClass 
{

    // ... accessors, constuctors other methods, et al... 

    // The method in question:
    private function myPrivateMethod()
    {
        if( !function_exists( 'someArbitraryFunction' ) )
        {
            function someArbitraryFunction( $args )
            {
                return "Hello, {$args} world!";
            }
        }            
    } 

    public function run(){
        $this->myPrivateMethod();
    }
}

var_dump(function_exists('someArbitraryFunction')); // false
$obj = new MyClass();
$obj->run();
var_dump(function_exists('someArbitraryFunction')); // true

作为具有 C/C++ 背景的语言,函数和方法之间有不同的行为。在 PHP 中,函数不服从访问修饰符。

无论它们写在代码中的什么位置,一旦执行通过声明,它就会被定义。

如果您需要一个函数来遵守作用域,我强烈建议您这样做,因为您可以更好地利用变量的 GC,您可以在 >= PHP 5.3 中使用闭包:

class MyClass{

    private $myArbitraryMethod;

    private function myPrivateMethod(){
        $this->myArbitraryMethod = function($args){

        }
    }

}
于 2012-10-24T03:05:46.320 回答