У меня проблемы с записью в свойства класса с помощью API Reflection. $p->setValue($r, $value)
выдает исключение, говорящее о том, что свойство доступно только для чтения, однако PHP (насколько мне известно) не имеет свойств класса только для чтения (только методы, использующие final
), так в чем здесь проблема?
код проблемы:
public function apply($source, $target) {
$r = new \ReflectionObject($target);
foreach ($source as $key => $value) {
// $this->entries[$key] maps to a valid property of $target. Confirmed working
$p = $r->getProperty($this->entries[$key]);
$p->setAccessible(true);
$p->setValue($r, $value); // <--- problem here
}
}
Исключение гласит следующее:
Uncaught ReflectionException: Cannot set read-only property ReflectionObject::$name
Выдержка из отражаемого класса ($target
в приведенном выше фрагменте), эта проблема остается, задан ли ясвойства public
или оставьте private
class Target {
private $id;
private $name;
}
Ничего особенного с этим классом не происходит, просто обычный объект с конструктором по умолчанию.
Есть ли в документах что-то, чтоЯ пропустил, или это просто странность PHP, которую я должен принять?
Используя версию 7.1, но учтите, что я не работал с PHP более десяти лет (к счастью), поэтому я могу не знать об очевидных событиях.