РЕДАКТИРОВАТЬ: другое решение, о котором я могу подумать, - это переназначить ваши локальные объекты на элементы массива, например:
$dec->addObjects( $a);
$std = $a[0];
print_r( $std );
Теперь $std
является ссылкой на декорированный объект.
decorator Object
(
[decoratee:protected] => stdClass Object
(
)
)
У меня пока нет практического решения, но я думаю, что могу объяснить поведение.
Это происходит потому, что ссылки на объекты по умолчанию передаются по значению. Итак, в вашем примере массив фактически содержит новую ссылку на объект:
$a = array( $std );
Итак, у вас есть две ссылки на объект:
- Один создан при инициализации объекта, а
- Один принадлежит массиву.
Это объясняет, почему печать $std
дает вам тот же объект, как если бы он не был украшен, потому что вы смотрите $std
, как он был создан здесь, что не то как тот, который содержится в массиве:
$std = new StdClass;
Ваши объекты decorator
и test
работают с одним и тем же объектом в вашем массиве, поэтому выгрузка $a
из вашего вызывающего кода приводит к созданию декорированного объекта.
В настоящее время единственный способ заставить PHP изменить ваш объект, это передать его по ссылке на ваш массив, например:
$a = array( &$std );
Конечно, это будет довольно хакерское решение, которое может не соответствовать вашим потребностям.