1

我有一个小问题。在 javascript 中可以转发范围:

var aaa = new function () {
    that = this;
    that.bbb  = 'foo';
    this.ccc = new function () {
        this.ddd = 'bar';
        this.eee = function () {
            return that.bbb+this.ddd;
        }
    }
}

aaa.ccc.eee() 将返回“foobar”。我怎样才能在 PHP 中做一些具有相同效果的事情?我有一个代码:

class bbb {
    public $ccc = 'bar';
        function __construct () {
            echo($that->aaa.$this->ccc);
        }
}
class aaa {
    public $that;
    public $aaa = 'foo';
    public $bbb;
    function __construct () {
        echo($this->aaa);
        $this->$bbb = new bbb();
        $this->$that = $this;
    }
}
$a = new aaa ();

我有没有使用类似的东西:

$this->bbb = new bbb ($this);

class bbb {
    public $that;
    function __contruct ($parent) {
        $that = $parent
        ....
    }
}

?

4

3 回答 3

3

没有什么能阻止你做与 JS 代码完全相同的事情,尽管这不是你在 PHP 中每天都能看到的:

PHP 5.3

$aaa = (object)array(
    'bbb' => 'foo',
    'ccc' => (object) array(
        'ddd' => 'bar',
        'eee' => function() use(&$aaa){ $self = $aaa->ccc; return $aaa->bbb.$self->ddd; }
    ),
);

echo call_user_func($aaa->ccc->eee);

请注意,在 PHP 5.3 中,无法$this在闭包内使用变量,因此您必须从导入的变量之一(在本例中)开始获取必要的上下文$aaa

另外,请注意,您不能“直接”调用该函数,$aaa-ccc->eee()因为 PHP 很糟糕:$aaa->ccc是一个类型的对象,stdClass并且该类没有名为 的正式成员eee

通过引用捕获,我在这里也很“可爱” $aaa,它可以在一行中定义整个对象图(如果$aaa需要在一个语句中定义没有闭包的情况下按值捕获,然后在另一个语句中添加闭包$aaa->ccc->eee = function() ...)。

PHP 5.4

$aaa = (object)array(
    'bbb' => 'foo',
    'ccc' => (object) array(
        'ddd' => 'bar',
        'eee' => function() use(&$aaa) { return $aaa->bbb.$this->ddd; }
    ),
);

$aaa->ccc->eee = $aaa->ccc->eee->bindTo($aaa->ccc);
echo call_user_func($aaa->ccc->eee);

在 PHP 5.4 中$this,只要您bindTo先“重新绑定”它,就可以在闭包内使用它。由于前面提到的相同原因,您不能在定义闭包的同时这样做:PHP 很烂。

于 2012-08-01T11:34:56.047 回答
1

您在 javascript 中所做的与您在 PHP 中所做的完全不同。在 javascript 中,您正在执行闭包,而在 PHP 中,您正在执行一些格式错误的类。

在 PHP 中,最接近的等价物是(虽然因为没有 IIFE 等而丑陋)

$tmp = function() {
    $that = new stdClass();
    $that->bbb = "foo";

    $tmp = function() use ($that) {
        $this_ = new stdClass();
        $this_->ddd = "bar";
        $this_->eee = function() use ($that, $this_) {
            return $that->bbb . $this_->ddd;
        };
        return $this_;
    };
    $that->ccc = $tmp();
    return $that;
};

$aaa = $tmp();

var_dump( call_user_func( $aaa->ccc->eee ));
//string(6) "foobar"

在 php 5.4.5 中测试。

于 2012-08-01T11:30:45.263 回答
0
class bbb {
    function __construct ($parrent) {
        echo $parrent->ccc;
    }
}

class aaa {
    public $aaa = 'foo';
    public $bbb;
    public $ccc = 'bar';

    function __construct () {
        echo $this->aaa;
        $this->bbb = new bbb($this);
    }
}

$a = new aaa();
于 2012-08-01T11:42:13.677 回答