Допустим, у меня есть следующий код:
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, но я пропустил это или использовал неправильные ключевые слова для поиска. Я был бы счастлив, если бы вы указали мне правильное направление.
Это едва ли возможно, потому что вещи происходят один за другим, так как функция не осознает внешний мир. В твоем случае $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
});