Передача по ссылке;почему исходный объект не изменился? - PullRequest
5 голосов
/ 29 мая 2011

Если объекты передаются по ссылке в PHP5, то почему $foo ниже не меняется?

$foo = array(1, 2, 3);
$foo = (object)$foo;

$x = $foo;            // $x = &$foo makes $foo (5)!
$x = (object)array(5);

print_r($foo); // still 1,2,3

, поэтому:

Передача по ссылке нето же самое, что и assign.

, тогда почему $foo ниже равно (100, 2, 3)?

$foo = array('xxx' => 1, 'yyy' => 2, 'zzz' => 3);
$foo = (object)$foo;

$x = $foo;            
$x->xxx = 100;

print_r($foo);

Ответы [ 4 ]

5 голосов
/ 29 мая 2011

Проблема лежит здесь:

$x = $foo;   
$x = (object)array(5);

В первом правиле $ x ссылается на $ foo; редактирование $ x будет также редактировать $ foo;
(это называется «назначение по ссылке», а не «передача по ссылке» * 1)

$x->myProperty= "Hi";

Приводит к тому, что $ foo также имеет свойство "myProperty".

Но на следующей строке вы ссылаетесь на $ x на new объект.
Эффективно не ссылаясь на $ x из $ foo, все внесенные вами изменения в $ x не будут распространяться на $ foo.


* 1: Когда вы вызываете функцию, объекты, которые вы передаете функциям (в php5) "передаются по ссылке"

2 голосов
/ 29 мая 2011

Мало того, что объекты передаются по ссылке; они также назначены по ссылке (о чем вы на самом деле говорите):

Исключение из обычного поведения по значению в PHPпроисходит с объектами, которые назначаются по ссылке в PHP 5.

Однако в первом примере вы выполняете операцию приведения. Это влечет за собой копию :

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

Массивы имеют собственный тип в PHP и не являются объектами;таким образом, вышеупомянутое правило применяется.

1 голос
/ 29 мая 2011

Передача по ссылке не совпадает с присвоением.

0 голосов
/ 29 мая 2011

Сначала вы создаете объект путем приведения массива в объект.Затем вы создаете переменную и передаете этот объект по ссылке.Но это не работает, потому что после этого вы назначаете какой-то другой объект (приведенный из нового массива) в эту вторую переменную.

В результате ссылка на второй объект изменилась, сам первый объект не был изменен..

Подробнее о объектах и ​​ссылках .

...