Le matrici in PHP vengono copiate come valore o come riferimento a nuove variabili e quando passano alle funzioni?


259

1) Quando un array viene passato come argomento a un metodo o a una funzione, viene passato per riferimento o per valore?

2) Quando si assegna un array a una variabile, la nuova variabile è un riferimento all'array originale o è una nuova copia?
Che ne dici di fare questo:

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

È $bun riferimento a $a?



3
@MarlonJerezIsla: sembra che l'array sia clonato solo se lo si modifica all'interno della funzione. Proviene ancora da altre lingue, sembra strano.
user276648

Risposte:


276

Per la seconda parte della tua domanda, vedi la pagina dell'array del manuale , che afferma (citando) :

L'assegnazione di array implica sempre la copia di valore. Utilizzare l'operatore di riferimento per copiare un array per riferimento.

E l'esempio dato:

<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
             // $arr1 is still array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>


Per la prima parte, il modo migliore per essere sicuri è provare ;-)

Considera questo esempio di codice:

function my_func($a) {
    $a[] = 30;
}

$arr = array(10, 20);
my_func($arr);
var_dump($arr);

Darà questo risultato:

array
  0 => int 10
  1 => int 20

Il che indica che la funzione non ha modificato l'array "esterno" che è stato passato come parametro: è passato come una copia e non come riferimento.

Se vuoi che venga passato per riferimento, dovrai modificare la funzione in questo modo:

function my_func(& $a) {
    $a[] = 30;
}

E l'output diventerà:

array
  0 => int 10
  1 => int 20
  2 => int 30

Come, questa volta, l'array è stato passato "per riferimento".


Non esitate a leggere la sezione Spiegazioni dei riferimenti del manuale: dovrebbe rispondere ad alcune delle vostre domande ;-)


che dire qualcosa come $ a = & $ this-> a. $ A ora è un riferimento a & this-> a?
Frank,

1
Mentre stai usando &, sì, dovrebbe - vedi php.net/manual/en/…
Pascal MARTIN

1
santa mucca, non riesco a credere che questo sia il problema che ho avuto ... dovrebbe essere una lezione, leggi sempre il manuale di partenza
Heavy_Bullets

2
Ciao Pascal, ho trovato che la risposta di Kosta Kontos sembra essere più accurata. Faccio un semplice test rapido per confermare la sua scoperta gist.github.com/anonymous/aaf845ae354578b74906 Puoi commentare anche la sua scoperta?
Cheok Yan Cheng,

1
Questo è il problema che stavo riscontrando anch'io: pensavo fosse qualcosa di strano negli array nidificati, ma in realtà era proprio come funziona l'assegnazione degli array in PHP.
Elenco Jeremy del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.