2016-08-04 5 views
1

В объектах PHP автоматически передаются по ссылке:Как передать PHP объект не по ссылке

$obj1 = new stdClass(); 
$obj1->foo = 'bar'; 
$obj2 = $obj1; 
$obj2->foo = 'OOF'; 
var_dump($obj1->foo); // OOF 

Есть элегантный способ скопировать эту переменную и не относится к исходной переменной? Я хочу сохранить копию объекта, а затем изменить его без использования оригинала. Благодарю.

+3

Just ** clone ** it! – Rizier123

+0

Почему? В чем смысл передачи объектов по стоимости? BTW: объекты не передаются по ссылке, вы фактически передаете идентификатор объекта. Предположим, что вы создаете объект, этот экземпляр хранится в памяти и назначается идентификатор (например, 123), передавая этот экземпляр на самом деле, передает этот идентификатор по значению, а вызываемая функция/метод затем извлекает этот объект с помощью идентификатора. Ссылка немного отличается: '$ x = new stdClass; $ y = &$x; $ y = null; var_dump ($ x); 'dump' null' –

+0

«Почему?» <- Я не понимаю этот вопрос. Я хочу изменить «копию» переменной без создания оригинала? Я что-то упускаю? Есть что-то экзотическое в этом случае? Пример: я хочу сохранить список объектов и зарегистрировать их позже, но мне не нужно КАЖДОЕ свойство. Поэтому я «клонировал» и «не задавал» набор свойств, которые мне не нужны для целей отладки. Имеют смысл? – emersonthis

ответ

6

Вы можете clone объект:

$obj2 = clone $obj1; 

Обратите внимание, что $obj2 будет неполная копией $obj1. Как указано в руководстве по PHP:

Когда объект клонирован, PHP 5 будет выполнять неполную копию всех свойств объекта. Любые свойства, которые являются ссылками на другие переменные , останутся ссылками.

Вы можете переопределить метод __clone(), чтобы вручную клонировать любые подобъекты, если хотите.

+0

Nice. Я не знал об этом. Спасибо, Виктор. +1 – BeetleJuice

+0

Опасайтесь, он не клонирует объекты, которые хранятся в свойствах клонированного объекта. Вам нужно клонировать их явно через '__clone' – Torben

+0

@Torben Что происходит с свойствами, которые являются объектами при клонировании? Они просто исчезают в копии? Или, может быть, они переключаются на «нуль»? – emersonthis

Смежные вопросы