Переменные объекта (в массив) в PHP - PullRequest
1 голос
/ 15 января 2012

Вот код:

$obj = new stdClass;
$obj->AAA = "aaa";
$obj->BBB = "bbb";

$arr = array($obj, $obj);

print_r($arr);

$arr[1]->AAA = "bbb";
$arr[1]->BBB = "aaa";

print_r($arr);

А вот и вывод:

Array
(
    [0] => stdClass Object
        (
            [AAA] => aaa
            [BBB] => bbb
        )

    [1] => stdClass Object
        (
            [AAA] => aaa
            [BBB] => bbb
        )

)

Array
(
    [0] => stdClass Object
        (
            [AAA] => bbb
            [BBB] => aaa
        )

    [1] => stdClass Object
        (
            [AAA] => bbb
            [BBB] => aaa
        )

)

Может кто-нибудь объяснить мне, почему все переменные объекта (которые находятся в массиве) изменены?

И извините за мой плохой английский.Я не являюсь носителем английского языка.

Ответы [ 2 ]

3 голосов
/ 15 января 2012

Массив хранит две ссылки на один и тот же объект, а не два разных объекта, как показано ниже:

array(
    0 =>  ---|          stdClass
             |------->     [AAA] => bbb
    1 =>  ---|             [BBB] => aaa
)

Если вы хотите скопировать объект, используйте clone, который выполняет поверхностную копию объекта:

$arr = array($obj, clone $obj);
0 голосов
/ 15 января 2012

Вам необходимо создать новый экземпляр класса

$obj2 = new stdClass;
$obj2->AAA = "bbb";
$obj2->BBB = "aaa";

$arr = array($obj, $obj2);

В противном случае ваш массив содержит 2 указателя на один и тот же объект.Оператор обновления изменяет базовый объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...