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

时间:2014-10-14 14:04:33

标签: php class oop callback

假设我有以下代码:

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文档,并试图搜索谷歌的解决方案,但我错过了这个或我使用错误的关键字进行搜索。如果你能指出我正确的方向,我会很高兴。

2 个答案:

答案 0 :(得分:1)

这几乎是不可能的,因为事情是一个接一个地发生的,而且功能还没有意识到外面的世界。在你的情况下,$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";
});

答案 1 :(得分:1)

你定义了类范围之外的函数,在它内部工作得很好。 并且$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
});