Не удается установить свойство только для чтения ReflectionObject - PullRequest
0 голосов
/ 06 ноября 2019

У меня проблемы с записью в свойства класса с помощью 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 более десяти лет (к счастью), поэтому я могу не знать об очевидных событиях.

1 Ответ

1 голос
/ 06 ноября 2019

Вы должны передать экземпляр, для которого хотите установить свойство, в качестве первого аргумента в вызове setValue().

Посмотрите на этот пример:

<?php

class A
{
    private $name = 'ABC';
}

$obj = new A();

$r = new ReflectionObject( $obj );
$prop = $r->getProperty( 'name' );
$prop->setAccessible( true );
$prop->setValue( $obj, 'DEF' );

var_dump( $obj );

https://3v4l.org/ZdK27

Вывод:

object(A)#1 (1) { ["name":"A":private]=> string(3) "DEF" }

В настоящее время вы пытаетесь установить свойство экземпляра ReflectionObject, который по совпадению имеет свойство с тем же именем. Но это не допускается средой выполнения, так как это может нарушить настройку отражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...