Невозможно, чего вы хотите достичь. Объяснение приведено в справочной документации Spring .
В PHP массивы назначаются по копии, а объекты назначаются по ссылке. Это означает, что:
$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);
Выдает:
array(0) {
}
Тогда как:
$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);
Выдает:
object(stdClass)#1 (1) {
["foo"]=>
int(42)
}
Вы можете запутаться в таких тонкостях, как ArrayObject
, который представляет собой объект, который действует точно как массив. Однако, будучи объектом, он имеет ссылочную семантику.
Редактировать: @AndrewLarsson поднимает вопрос в комментариях ниже. В PHP есть специальная функция, которая называется «ссылки». Они чем-то похожи на указатели в таких языках, как C / C ++, но не совсем то же самое. Если ваш массив содержит ссылки, тогда, хотя сам массив передается копией, ссылки все равно будут преобразовываться в исходную цель. Это, конечно, обычно желаемое поведение, но я подумал, что об этом стоит упомянуть.
foreach($a as $key => $val) $b[$key] = $val ;
Сохраняет и ключ и значения. Выстройте точной копии 'b'
массиваКогда вы делаете
$array_x = $array_y;
PHP копирует массив, я не уверен, как вы могли бы сгореть. В вашем случае
global $foo;
$foo = $obj->bar;
должен работать нормально.
Я думаю, что для того, чтобы сгореть, вам нужно было либо использовать ссылки, либо ожидать клонирования объектов внутри массивов.
PHP скопирует массив по умолчанию. Ссылки в PHP должны быть явными.
$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a