我需要帮助理解在类方法中声明的函数的范围

时间:2012-10-24 03:02:46

标签: php scope

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

以下是一个示例:

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!";
            }
        }            
    } 
}

该类像往常一样实例化,并且在应用程序的早期实例化,但它在另一个类的方法中实例化。它是一个浅的范围链,但是嵌套得足以让它(对我而言)为什么它可以在应用程序之外访问。这违背了我对封装的理解,一些见解会非常感激。

1 个答案:

答案 0 :(得分: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){

        }
    }

}