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 ;-)