在回调执行中访问对象属性


Accessing object properties within a callback execution

假设我有以下代码:

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
});