#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;