Доступ к свойствам объекта при выполнении обратного вызова

Допустим, у меня есть следующий код:

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 и попытался найти решение для Google, но я пропустил это или использовал неправильные ключевые слова для поиска. Я был бы счастлив, если бы вы указали мне правильное направление.

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

Другие решения

Вы определяете функцию вне области видимости класса, внутри нее она работает просто отлично.
А также $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
});
1

По вопросам рекламы [email protected]