假设我有以下代码:
class RandomNumber{
public $number;
function __construct($range,$callback){
$this->number = rand(0,$range);
$callback();
}
}
$rnd = new RandomNumber(9,function(){
echo "Line 11: ".$rnd->number."'n"; // Not working: empty variable
echo "Line 12: ".$number."'n"; // Not working: empty variable
echo "Line 13: ".$this->number."'n"; // Not working: Fatal error: Using $this when not in object context on line 13
});
echo "Line 15: ".$rnd->number."'n"; // Working: echoed random number
因此,我尝试访问新创建的对象的属性(number
)。我猜不出该怎么做。我阅读了一些PHP文档,并试图在谷歌上搜索解决方案,但我错过了,或者我在搜索时使用了错误的关键字。如果你能为我指明正确的方向,我会很高兴的。
这几乎不可能,因为事情一个接一个地发生,而且函数不知道外部世界。在您的情况下,$rnd
是在函数外部声明的,因为它还没有初始化(它将在整行执行之后)
是的,您不能使用$this
,但您可以传递$this
来注入新创建的对象。
class RandomNumber{
public $number;
function __construct($range,$callback){
$this->number = rand(0,$range);
$callback($this);
}
}
$rnd = new RandomNumber(9,function($obj){
echo "Line 11: ".$obj->number."'n";
});
您在类的作用域之外定义函数,在类内部它可以正常工作。$rnd
无法在其中工作,因为它尚未填充,这将在构造函数完成工作后发生。
这项工作:
class RandomNumber{
public $number;
function __construct($range,$callback){
$this->number = rand(0,$range);
$callback($this);
$call2 = function(){
echo "Line 7 : " .$this->number."'n"; // Works
};
$call2();
}
public function callback($callback){
$callback();
}
}
$rnd = new RandomNumber(9,function($rnd){
echo "Line 15: ".$rnd->number."'n"; // Works
});
$rnd->callback(function() use ($rnd) {
echo "Line 19: ".$rnd->number."'n"; // Works
});