Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我需要帮助理解在类方法中声明的函数的范围_Php_Scope - Fatal编程技术网

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

Php 我需要帮助理解在类方法中声明的函数的范围,php,scope,Php,Scope,好了,这已经烤了我一段时间的面条了。我有一个类,它有一个定义全局可访问函数的方法。我的问题是:内部类方法如何定义在全局范围内可访问的函数 以下是一个示例: class MyClass { // ... accessors, constuctors other methods, et al... // The method in question: private function myPrivateMethod() { if( !funct

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

以下是一个示例:

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

该类像往常一样在应用程序的早期被实例化,但它是在另一个类的方法中被实例化的。它是一个浅范围链,但嵌套得太多,以至于(对我来说)无法理解为什么它可以在应用程序之外访问。这与我对封装的理解背道而驰,一些见解将不胜感激

声明的函数将始终具有全局作用域。这不是JavaScript

见:

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

不管它们写在代码中的什么位置,一旦执行通过声明,它就被定义了

如果您需要一个函数来遵循作用域,我强烈建议您更好地利用变量的GC,那么您可以在>=PHP5.3中使用闭包:

class MyClass{

    private $myArbitraryMethod;

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

        }
    }

}

我刚刚看到了这个,从文件来看,是设计的。。。我明白为什么它现在起作用了,但它似乎是错的。简单地把函数看作全局函数。如果您需要函数遵守作用域,我建议使用PHP5.3中的闭包。谢谢,我想这正是让我吃惊的地方。我现在明白了,我可以看到它是如何被滥用的。太棒了!我很高兴你把它弄清楚了。(:
class MyClass{

    private $myArbitraryMethod;

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

        }
    }

}