2010-11-23 3 views
0

Я новичок в программировании в целом и ссылок в частности. Я хочу манипулировать отдельными объектами в массиве по ссылке, так что я не работаю на простых экземплярах объектов, которые я хотел бы вставить в массив. Мой вопрос - как это сделать.Ссылки и массивы в PHP

Например, предположим, что у меня есть следующие строки кода:

$obj0 = blah; 
$obj1 = blah; 
$obj2 = blah; 
$myArray = array($obj0, $obj1, $obj2); 

Когда я теперь получить доступ и изменить $myArray[1], будет ли это так же, как изменение $obj1? Или мне пришлось бы изменять &$myArray[1]?

+0

Вы используете PHP5 и те $ objN фактические объекты или переменные? – Orbling 2010-11-23 20:42:34

+0

Да, я использую PHP5, и я намеревался, чтобы они были переменными с объектами как значениями. Извините, если я запутался/запутался в моем вопросе. – Mark 2010-11-23 20:50:21

ответ

1

Как она стоит, нет, вы не будете изменять исходные переменные.

Если вы хотите сделать это по ссылке, вы должны поместить эти амперсанды при настройке массива так.

$myArray = array(&$obj0, &$obj1, &$obj2); 

Код:

$a = "cat"; $a1 = "cat"; 
    $b = "dog"; $b1 = "dog"; 
    $arrRef = array(&$a, &$b); $arrCopy = array($a, $b); 
    $arrRef[0] .= "food"; $arrCopy[0] .= "food"; 
    $arrRef[1] .= "house"; $arrCopy[1] .= "house"; 
    echo "a: $a b: $b <br />"; 
    echo "a1: $a1 b1: $b1 <br />"; 

Выход:

a: catfood b: doghouse 
a1: cat b1: dog 
0

В PHP5 объекты по умолчанию называются «по ссылке», поэтому нет необходимости добавлять $myArray[1] с «&».

+0

-1 Утверждение «Объекты PHP5 вызываются по ссылке» должны умереть. Я знаю, что это в официальной документации PHP, но это просто неправильно! PHP-объекты фактически привязаны к переменным по ссылкам, да. Но эти ссылки копируются '=' или при использовании в качестве аргумента, как и любая другая переменная. Если вы хотите получить семантику «по ссылке», единственным (единственным) способом является использование оператора &. См. @thisMayhem ответ – 2010-11-23 20:55:55

1

Нет, изменение $myArray[1] - это не то же самое, что и изменение $obj1. Однако, если вы работаете над объектом, на который оба указывают, этот объект будет изменен.

Другими словами:

// Does not affect $obj1, but it does affect $obj1->foo 
$myArray[1]->foo = "bar"; 

// Does not affect $obj1, which continues to point to the same object 
$myArray[1] = null; 
Смежные вопросы