PHP: способ получить свойство без геттера?

По сути, идея заключается в следующем:

Объект создается из запроса базы данных. Одно из его полей содержит закодированную строку, которая декодируется в геттере.

Проблема в том, что мне нужно создать частичную копию этого объекта. И эта копия должна содержать закодированную строку, а не декодированную версию. Очевидно, что когда я пытаюсь напрямую скопировать значение, он вызывает геттер.

Есть ли обходной путь для такой проблемы, кроме создания копии поля без геттера?

UPD: я использую магический метод, а не точно получатель (мой плохой, первый вопрос)

public function __get($property){
    ...
        case 'version':
            return $this->_getVersion();
}

Клонирование объекта - это не тот случай, поскольку второй объект также происходит из БД, и ему просто необходимо заменить некоторые поля, например

$item1->version = $item2->version;

2 ответа

В итоге я нашел оптимальный способ сделать это.

Я переместил функцию декодирования из метода __get() в метод __set(). Теперь я храню закодированную строку только в БД, а декодированный массив - только в модели.

Тем самым я гарантирую, что данные, хранящиеся в поле, одного типа. Также я проверяю, хранится ли массив в поле. Это указывает, были ли данные уже декодированы.

class AClass
{
    private $someProperty = 'SSBwcm92aWRlIHRoZSBiZXN0IHNvbHV0aW9ucyE=';

    public function getSomeProperty()
    {
        return base64_decode($this->someProperty);
    }
}

// Get the instance.
$object = new AClass;

// Get the property.
$property = (new ReflectionClass($object))->getProperty('someProperty');

// Make it accessible.
$property->setAccessible(true);

// Get the value of the property for the instance.
echo $property->getValue($object);

выходы:

SSBwcm92aWRlIHRoZSBiZXN0IHNvbHV0aW9ucyE =

Другие вопросы по тегам