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.