我有点问题。在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
....
}
}
答案 0 :(得分:3)
没有什么能阻止你做与JS代码完全相同的事情,虽然这不是你每天在PHP中看到的东西:
$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
捕获,那么闭包添加了{{ 1}}在另一个)。
$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);
。首先是$this
。出于前面提到的相同原因,你无法在定义闭包的同时做到这一点:PHP糟透了。
答案 1 :(得分: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中测试。
答案 2 :(得分: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();