regola Facile: se fate un &
davanti a un nome di funzione in PHP è possibile utilizzare &
quando si chiama la funzione (. Cioè il suo valore di ritorno) come se fosse una variabile e non una funzione.
Questo è tutto.
È più facile pensarlo come "PHP che consente di fare riferimento al valore restituito" piuttosto che a PHP che restituisce per riferimento. Come accennato in precedenza, è sufficiente posizionare un &
per indicare a PHP che lo si desidera, se non lo si inserisce e provare a fare $var =& somefunction()
si otterrà l'errore "Solo le variabili devono essere assegnate per riferimento".
Per chiarire un po 'di confusione con la risposta di Jon. In realtà non è necessario avere due funzioni separate, una che restituisce per riferimento e una che restituisce per valore; al di fuori di alcune convenzioni di progetto. Il &
solo consente a di restituire per riferimento, non è forzarlo a restituire per riferimento.
es. stessa funzione utilizzata sia per le assegnazioni di riferimento e non di riferimento
\header('content-type: text/plain');
class Demo
{
protected $example = 'original value';
function & example()
{
return $this->example;
}
}
$demo = new Demo;
#1 - pass by value
$var1 = $demo->example();
$var1 = 'var1 value';
echo '$demo->example() => '.$demo->example().PHP_EOL;
echo PHP_EOL;
#2 - pass by reference
$var2 =& $demo->example();
$var2 = 'var2 value';
echo '$demo->example() => '.$demo->example().PHP_EOL;
echo '$var1 => '.$var1.PHP_EOL;
echo '$var2 => '.$var2.PHP_EOL;
echo PHP_EOL;
#3 - altering other references
$var3 =& $demo->example();
$var3 = 'var3 value';
echo '$demo->example() => '.$demo->example().PHP_EOL;
echo '$var1 => '.$var1.PHP_EOL;
echo '$var2 => '.$var2.PHP_EOL;
echo '$var3 => '.$var3.PHP_EOL;
echo PHP_EOL;
exit;
uscita
$demo->example() => original value
$demo->example() => var2 value
$var1 => var1 value
$var2 => var2 value
$demo->example() => var3 value
$var1 => var1 value
$var2 => var3 value
$var3 => var3 value
I riferimenti sono grandi se non hai familiarità con loro si prega di seguire le seguenti regole:
- considera solo l'utilizzo di riferimenti se si ha a che fare con strutture di dati di grandi dimensioni o strutture non oggettuali simili
- non fare mai riferimento a un oggetto (se lo si può evitare)
- consente solo a una funzione di passare per riferimento se il valore viene mantenuto in una proprietà statica o in un attributo sull'oggetto (es. non è una variabile temporanea all'interno della funzione)
Le eccezioni sarebbero ovviamente usi molto utilitari (ad esempio quando si desidera condividere un valore per semplificare il codice per manipolarlo).
Anche in questo caso, MAI riferimento a oggetti (è inutile!)
I [docs PHP] (http://php.net/manual/en/language.references.return.php) è la risposta definitiva a questo - assicurati di sfogliare tutta la sezione "Riferimenti spiegati". – Jon
Cmon Jon, ho detto che ho già letto la documentazione e ammettere che non l'ho capito abbastanza bene da lì. questa è la ragione per cui ti sto chiedendo qui, sarei grato se tu abbia qualcuno della tua versione da spiegare :) –
Il link fornito da Jon lo spiega bene con l'esempio. – xdazz