PHP
Riferimenti
Ricerca…
Sintassi
-
$foo = 1; $bar = &$foo; // both $foo and $bar point to the same value: 1
-
$var = 1; function calc(&$var) { $var *= 15; } calc($var); echo $var;
Osservazioni
Assegnando due variabili per riferimento, entrambe le variabili puntano allo stesso valore. Prendi il seguente esempio:
$foo = 1;
$bar = &$foo;
$foo
non punta a $bar
. $foo
e $bar
puntano entrambi allo stesso valore di $foo
, che è 1
. Illustrare:
$baz = &$bar;
unset($bar);
$baz++;
Se avessimo un points to
relazione, questo sarebbe stato interrotto subito dopo unset()
; invece $foo
e $baz
puntano ancora allo stesso valore, che è 2
.
Assegna per riferimento
Questa è la prima fase di riferimento. Essenzialmente quando assegni per riferimento , stai permettendo a due variabili di condividere lo stesso valore.
$foo = &$bar;
$foo
e $bar
sono uguali qui. Non puntano l'un l'altro. Puntano allo stesso posto ( il "valore" ).
È inoltre possibile assegnare per riferimento all'interno del costrutto del linguaggio array()
. Pur non essendo rigorosamente un incarico per riferimento.
$foo = 'hi';
$bar = array(1, 2);
$array = array(&$foo, &$bar[0]);
Si noti , tuttavia, che i riferimenti all'interno degli array sono potenzialmente pericolosi. L'assegnazione normale (non di riferimento) con un riferimento sul lato destro non trasforma il lato sinistro in un riferimento, ma i riferimenti all'interno degli array vengono mantenuti in questi normali compiti. Questo vale anche per le chiamate alle funzioni in cui l'array viene passato per valore.
L'assegnazione per riferimento non è limitata solo a variabili e array, ma è anche presente per le funzioni e tutte le associazioni "pass-by-reference".
function incrementArray(&$arr) {
foreach ($arr as &$val) {
$val++;
}
}
function &getArray() {
static $arr = [1, 2, 3];
return $arr;
}
incrementArray(getArray());
var_dump(getArray()); // prints an array [2, 3, 4]
L'assegnazione è la chiave all'interno della definizione della funzione come sopra. Non puoi passare un'espressione per riferimento, solo un valore / variabile. Da qui l'istanziazione di $a
in bar()
.
Ritorno per riferimento
Occasionalmente arriva il momento per te di ritornare implicitamente per riferimento.
Il ritorno per riferimento è utile quando si desidera utilizzare una funzione per trovare a quale variabile deve essere associato un riferimento. Non utilizzare il ritorno per riferimento per aumentare le prestazioni. Il motore lo ottimizzerà automaticamente da solo. Restituisci i riferimenti solo se hai un valido motivo tecnico per farlo.
Tratto dalla Documentazione di PHP per la restituzione per riferimento .
Esistono molte forme diverse di ritorno per riferimento, incluso il seguente esempio:
function parent(&$var) {
echo $var;
$var = "updated";
}
function &child() {
static $a = "test";
return $a;
}
parent(child()); // returns "test"
parent(child()); // returns "updated"
Il reso per riferimento non è limitato solo ai riferimenti alle funzioni. Hai anche la possibilità di chiamare implicitamente la funzione:
function &myFunction() {
static $a = 'foo';
return $a;
}
$bar = &myFunction();
$bar = "updated"
echo myFunction();
Non è possibile fare direttamente riferimento a una chiamata di funzione, deve essere assegnata a una variabile prima di sfruttarla. Per vedere come funziona, prova semplicemente echo &myFunction();
.
Gli appunti
- Ti è richiesto di specificare un riferimento (
&
) in entrambi i posti in cui intendi usarlo. Ciò significa, per la definizione della funzione (function &myFunction() {...
) e nel riferimento alla chiamata (function callFunction(&$variable) {...
o&myFunction();
). - Puoi solo restituire una variabile per riferimento. Da qui l'istanziazione di
$a
a nell'esempio sopra. Ciò significa che non è possibile restituire un'espressione, altrimenti verrà generato un errore PHPE_NOTICE
(Notice: Only variable references should be returned by reference in ......
). - Il reso per riferimento ha casi d'uso legittimi, ma dovrei avvertire che dovrebbero essere usati con parsimonia, solo dopo aver esplorato tutte le altre potenziali opzioni per raggiungere lo stesso obiettivo.
Passa per riferimento
Ciò consente di passare una variabile facendo riferimento a una funzione o elemento che consente di modificare la variabile originale.
Passare-per-riferimento non è limitato alle sole variabili, il seguente può anche essere passato per riferimento:
- Nuove affermazioni, ad es.
foo(new SomeClass)
- Riferimenti restituiti da funzioni
Array
Un uso comune di "passing-by-reference" è di modificare i valori iniziali all'interno di un array senza andare al punto di creare nuovi array o sporcare il tuo spazio dei nomi. Il passaggio per riferimento è semplice come il precedente / prefisso della variabile con un &
=> &$myElement
.
Di seguito è riportato un esempio di sfruttamento di un elemento da un array e semplicemente aggiungendo 1 al suo valore iniziale.
$arr = array(1, 2, 3, 4, 5);
foreach($arr as &$num) {
$num++;
}
Ora, quando sfrutti qualsiasi elemento all'interno di $arr
, l'elemento originale verrà aggiornato man mano che il riferimento è stato aumentato. Puoi verificare questo:
print_r($arr);
Nota
Si dovrebbe prendere nota quando lo sfruttamento passa per riferimento all'interno di anelli. Alla fine del ciclo precedente,
$num
mantiene ancora un riferimento all'ultimo elemento dell'array. Assegnandolo al post loop finirà per manipolare l'ultimo elemento dell'array! Puoi assicurarti che ciò non avvengaunset()
'it post-loop:$myArray = array(1, 2, 3, 4, 5); foreach($myArray as &$num) { $num++; } unset($num);
Quanto sopra ti assicurerà di non incorrere in alcun problema. Un esempio di problemi che potrebbero riguardare questo è presente in questa domanda su StackOverflow .
funzioni
Un altro uso comune per il passaggio per riferimento è all'interno delle funzioni. La modifica della variabile originale è semplice come:
$var = 5;
// define
function add(&$var) {
$var++;
}
// call
add($var);
Che può essere verificato facendo echo
alla variabile originale.
echo $var;
Esistono varie restrizioni relative alle funzioni, come indicato di seguito dai documenti PHP:
Nota: non vi è alcun segno di riferimento su una chiamata di funzione - solo sulle definizioni di funzione. Solo le definizioni di funzione sono sufficienti per passare correttamente l'argomento per riferimento. A partire da PHP 5.3.0, riceverai un avviso che dice che "pass-by-reference" è deprecato quando usi & in foo (& $ a) ;. A partire dalla versione 5.4.0 di PHP, il riferimento al passaggio delle chiamate è stato rimosso, quindi l'utilizzo di tale funzione genererebbe un errore irreversibile.