PHP相当于JavaScript绑定

首先请原谅我的英语我不是母语人士,如果看起来很粗糙,我很抱歉,这是我第一次在这个网站上发帖.
我想我的问题很简单.比方说,我们有:

class A {

    function foo() {

        function bar ($arg){
            echo $this->baz, $arg;
        }

        bar("world !");

    }

    protected $baz = "Hello ";

}

$qux = new A;

$qux->foo();

在这个例子中,“$this”显然不是指我的对象“$qux”.

我应该怎么做才能让它变成“$qux”呢?

可能在JavaScript中:bar.bind(this,“world!”)

解决方法:

PHP没有嵌套函数,因此在您的示例中,bar基本上是全局的.你可以通过使用从PHP 5.4支持binding的闭包(=匿名函数)来实现你想要的东西:

class A {
    function foo() {
        $bar = function($arg) {
            echo $this->baz, $arg;
        };
        $bar->bindTo($this);
        $bar("world !");
    }
    protected $baz = "Hello ";
}

$qux = new A;
$qux->foo();

UPD:但是,bindTo($this)没有多大意义,因为闭包会自动从上下文继承它(同样,在5.4中).所以你的例子可以简单地说:

    function foo() {
        $bar = function($arg) {
            echo $this->baz, $arg;
        };
        $bar("world !");
    }

UPD2:对于PHP 5.3-这似乎只有这样一个丑陋的黑客才有可能:

class A {
    function foo() {
        $me = (object) get_object_vars($this);
        $bar = function($arg) use($me) {
            echo $me->baz, $arg;
        };
        $bar("world !");
    }
    protected $baz = "Hello ";
}

这里get_object_vars()用于“发布”受保护/私有属性,以使它们在闭包内可访问.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...