2012-01-17 9 views
6

Powiel możliwe:
are arrays in php passed by value or by reference?przypisanie tablicy php przez skopiowanie wartości lub przez odniesienie?

Słyszałem, że PHP może wybrać sposób przypisać tablice, zależy od wielkości tablicy. Można przypisać, kopiując wartość (jak każdy typ skalarny) lub przez odniesienie.

PHP zawsze przypisuje tablicę do zmiennych, kopiując wartość, jak mówi w instrukcji.

Lub może przypisać przez odniesienie. ?

<?php $a = array(1,2,3); ?> 
+0

Czy jesteś po prostu chcą wiedzieć, czy to możliwe, aby przypisać tablicę przez odniesienie? Czy chcesz wiedzieć, czy jest jakiś sposób, aby to zrobić automatycznie? – jprofitt

+0

Chcę wiedzieć, że czasami silnik PHP może przekazać $ a = array (1,2,3); $ b = $ a; przez odniesienie bez znaku "&". – RusAlex

Odpowiedz

12

Nie można przypisać czegoś przez odniesienie, chyba że odwołujesz się do czegoś, co już istnieje. Podobnie nie można skopiować czegoś, co nie istnieje.

Więc ten kod:

$a = array(1,2,3); 

... ani kopie lub odnośników - to właśnie tworzy nową tablicę wypełnia ją wartościami, ponieważ wartości zostały określone dosłownie.

Jednak ten kod:

$x = 1; 
$y = 2; 
$z = 3; 
$a = array($x,$y,$z); 

... kopiuje wartości z $x, $y i $z do tablicy . Zmienne używane do inicjalizacji wartości tablicowych nadal istnieją same w sobie i mogą być modyfikowane lub niszczone bez wpływu na wartości w tablicy.

ten kod:

$x = 1; 
$y = 2; 
$z = 3; 
$a = array(&$x,&$y,&$z); 

... tworzy tablicę odwołań do $x, $y i $z (zawiadomienie &). Jeśli po uruchomieniu tego kodu zmienię $x - powiedzmy, że nadaję mu wartość 4 - zmodyfikuje on również pierwszą wartość w tablicy. Więc kiedy użyjesz tablicy, $a[0] będzie teraz zawierał 4.

Przeczytaj instrukcję this section w celu uzyskania dodatkowych informacji na temat pracy referencyjnej w PHP.


W zależności od rodzaju i wartości zmiennych stosowanych jako elementów macierzy, proces kopiowania może nastąpić w czasie przypisywania nawet gdy przypisany przez wartość. Wewnętrznie PHP korzysta z kopiowania przy zapisie w jak największej liczbie sytuacji ze względu na wydajność i wydajność pamięci. Jednak pod względem zachowania w kontekście twojego kodu możesz traktować go jak zwykłą kopię.

1

Tak, użyj &

$a = array(&$b, &$c, &$d); 
15

Przypisywanie tablic przez odniesienie jest możliwe podczas przypisywania zmiennych tablicowych do innych zmiennych:

// By value... 
$a = array(1,2,3); 
$b = $a; 
array_push($a, 5); 
print_r($b); 

// $b is not a reference to $a 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
) 

// By Reference 
$a = array(1,2,3); 
$b = &$a; // Here we assign by reference 
array_push($a, 5); 
print_r($b); 

// $b is a reference to $a and gets the new value (3 => 5) 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 5 
)