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

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

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

最佳答案

声明的函数将始终具有全局作用域。这不是 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){

        }
    }

}

关于php - 我需要帮助理解在类方法中声明的函数的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13042407/

相关文章:

php - 如何删除供应商表中的特定行数据导致错误是当我使用订单时删除了数据库中的所有供应商数据

PHP/JavaScript 如何将 2 个页面合二为一

ruby-on-rails - ActiveRecord 中 default_scope 的替代方案

angular - 有没有办法从 Chartjs 的点击功能调用组件的功能

javascript - 如何修复我的 CSS 并使我的网站看起来像博客或杂志?

php - 使用 mysql 排序规则的安全问题/sql 注入(inject)?

php - 数据表、Ajax 流水线

javascript - 将内部 var 的范围扩展到另一个函数

javascript - NodeJS 异步库并行方法奇怪的行为

r - 将整个包裹传递给雪簇