Как поместить копию объекта в массив в PHP

#php #arrays

#php #массивы

Вопрос:

Я пытался добавлять объекты в массив в PHP, но это не сработало, попробовал 2 метода:

#1

 $obj->var1 = 'string1';
$obj->var2 = 'string1';
$arr[] = $obj;
$obj->var1 = 'string2';
$obj->var2 = 'string2';
$arr[] = $obj;
  

#2

 $obj->var1 = 'string1';
$obj->var2 = 'string1';
array_push($arr,$obj);
$obj->var1 = 'string2';
$obj->var2 = 'string2';
array_push($arr,$obj);
  

Оба метода добавят последний объект во весь массив. Кажется, что объект добавляется в массив по ссылке. Есть ли способ добавить их в массив по значению?

Ответ №1:

Объекты всегда передаются по ссылке в php 5 или более поздней версии. Если вам нужна копия, вы можете использовать оператор clone

 $obj = new MyClass;
$arr[] = clone $obj;
  

Комментарии:

1. я полагаю, что в PHP 5 передается только по ссылке!

2. @RobertPitt Да, в PHP 4 объекты передавались по значению в таких ситуациях. Но в PHP 5 объекты передаются по ссылке.

3. @Michael, я намекал тебе, чтобы ты ссылался на это в своем посте.

4. @RobertPitt Я не могу, поскольку я не создавал этот ответ, но это хорошее предложение.

5. Ого, извините, я имел в виду @Decko, я отредактировал ответ за него.

Ответ №2:

Вы должны сначала клонировать объект, прежде чем вносить изменения:

 $obj->var1 = 'string1';
$obj->var2 = 'string1';
$arr[] = $obj;

$obj = clone $obj; // Clone the object

$obj->var1 = 'string2';
$obj->var2 = 'string2';
$arr[] = $obj;
  

Ответ №3:

В PHP 5 объекты передаются по ссылке, если специально не указано иное.

Здесь вы, вероятно, захотите clone сохранить объект при добавлении его в массив:

 $obj->var1 = 'string1';
$obj->var2 = 'string1';
$arr[] = clone $obj;
$obj->var1 = 'string2';
$obj->var2 = 'string2';
$arr[] = clone $obj;
  

Смотрите руководство.

Ответ №4:

Попробуйте это:

 $arr[] = clone $obj;