【问题标题】:PHP Objects and ClosuresPHP 对象和闭包
【发布时间】:2011-05-03 00:08:01
【问题描述】:

我最近一直在问一些关于这个主题的问题,所以我觉得将相关问题联系起来是合适的。

PHP closures and implicit global variable scope

我有一组使用闭包的类,如下例所示(请记住,我为此线程快速拼凑了这个示例)我的问题涉及将 $obj 参数传递给函数。

是否存在任何类型的 ma​​gic 变量 (cough-$this-cough) 可以让我访问调用它的对象,而不是需要声明一个占位符参数$obj 或其他什么?也许我读错了,但似乎我正在寻找的功能已被删除,至少在 $this 的上下文中。

class Test{

    private $_color;
    protected $_children = array();

    public function __construct(Closure $function){
        $function($this);
    }

    public function create(Closure $function){
        return new self($function);
    }

    public function color($color){
        $this->_color = $color;
        return $this;
    }

    public function add(Closure $function){
        $this->_children[] = new Test($function);
        return $this;
    }

}

Test::create(function($obj){
    $obj->color('Red')
        ->add(function(){
             $obj->color('Green');
        })
        ->color('Blue');
    });

我能看到的唯一替代方法是在创建时存储每个对象的实例,并提供一个函数来返回该实例,如下所示:

class Test{

    private $_color;
    private static $_instance;
    protected $_children = array();

    public function __construct(Closure $function){
        self::$_instance = $this;
        $function();
    }

    .
    .
    .

    public static function this(){
        return self::$_instance;
    }

}

Test::create(function(){
    Test::this()
        ->color('Red')
        ->add(function(){
            Test::this()
                ->color('Green');
        })
        ->color('Blue');
    });

【问题讨论】:

    标签: php object scope closures anonymous-function


    【解决方案1】:

    您应该使用第一个版本。静态提供类实例并不是很好(除了单例使用)。假设您有两个实例。然后只有后者将被静态服务。第一个你什么也做不了。

    即使是您的第一种方法,也有一个并非不重要的限制:您只能访问公共方法。有一个使用反射的hacky解决方法。那么,您只使用公共方法吗?

    在某一时刻,Closure 被认为是一个实现细节,因此不值得依赖。这已不再是这种情况; Closure 是记录在案的匿名函数类型。

    【讨论】:

    • 谢谢 nikic;只有公共方法被调用,所以可见性不是问题。我知道Closure 类的不可靠性,并且到时候会恢复为更永久的东西,我就像它在我正在使用的IDE 中提供的类型提示一样。无论如何,没有任何 magic 变量或其他我可以用来固有地实现此功能的技巧吗?
    猜你喜欢
    • 2017-02-12
    • 2010-10-04
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多