Этот ответ предназначен для сценария попытки обойти наложенное ограничение личных данных, например, если вы случайно работаете с библиотекой, к которой у вас нет доступа для изменения уровня привилегий члена класса, тогда это работа вокруг. Предполагая, что объект является сериализуемым / не сериализуемым, рассмотрим:
<?php
class SourceProtected {
private $foo = 'one';
protected $baz = 'two';
public $bar = 'three';
}
class SourceUnprotected {
public $foo = 'blah';
public $baz = 'two';
public $bar = 'three';
}
$protected = new SourceProtected();
$unprotected = new SourceUnprotected();
var_dump(serialize($protected), serialize($unprotected));
Вывод выглядит примерно так:
string(110) "O:15:"SourceProtected":3:{s:20:"?SourceProtected?foo";s:3:"one";s:6:"?*?baz";s:3:"two";s:3:"bar";s:5:"three";}"
string(92) "O:17:"SourceUnprotected":3:{s:3:"foo";s:4:"blah";s:3:"baz";s:3:"two";s:3:"bar";s:5:"three";}"
Таким образом, одним из решений является создание дублирующего класса, который изменяет уровень привилегий для переменных на все public. Затем сериализуйте рабочий объект, преобразуйте *** сериализованный класс в ваши версии, затем просто десериализуйте строку, и вы получите рабочий объект вашего типа класса с неограниченным доступом.
Очевидно, что в методе конвертации вам нужно будет немного поработать. Вам нужно либо создать обобщенный синтаксический анализатор, который может обработать любой случай, либо вы можете написать хакерскую работу только для вашей конкретной серии сценариев использования str_replaces.