Cosa significa avviare una funzione PHP con una e commerciale?


129

Sto usando la libreria di Facebook con questo codice:

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

Cosa significa & all'inizio della definizione della funzione e come posso utilizzare una libreria come questa (in un semplice esempio)

Risposte:


157

Una e commerciale prima del nome di una funzione indica che la funzione restituirà un riferimento a una variabile anziché al valore.

La restituzione 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 quando hai un valido motivo tecnico per farlo.

Vedere la sezione Riferimenti di ritorno .


1
Quindi, senza entrare troppo nei dettagli, chiameresti (con la classe istanziata) qualcosa come $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? Immagino di non essere sicuro della sfumatura qui, grazie per l'aiuto però.
Alex Mcp,

2
Sì, lo chiamerei così.
Dominic Rodger,

16

Restituisce un riferimento, come già detto. In PHP 4, gli oggetti sono stati assegnati in base al valore, proprio come qualsiasi altro valore. Questo non è molto intuitivo e contrariamente a come funziona la maggior parte delle altre lingue.

Per aggirare il problema, sono stati usati riferimenti per variabili che puntavano a oggetti. In PHP 5, i riferimenti sono usati molto raramente. Immagino che questo sia un codice legacy o un codice che cerca di preservare la compatibilità con PHP 4.


È la libreria PHP ufficiale di Facebook, FWIW.
Alex Mcp,

4
@Alex: In quel caso, probabilmente lo stanno facendo per proteggere gli hacker casuali, che usano php4, da loro stessi. Non dovresti farlo nel tuo codice: è obsoleto.
troelskn,

3
"Questo non è molto intuitivo e contrariamente a come funziona la maggior parte delle altre lingue" Non potrei essere più in disaccordo.
Razze di leggerezza in orbita

5
@WildlyInaccurate: l'assegnazione di oggetti per riferimento per impostazione predefinita, che è ciò che accade in .NET e in Java (penso), non è molto intuitiva. Nella maggior parte delle altre lingue, il compito viene svolto per copia, sia che si abbia un "oggetto" o una primitiva o altro, e poiché questo è stato il caso fin dall'alba dei tempi, questo è ciò a cui il mondo avrebbe dovuto attenersi.
Corse di leggerezza in orbita

4
Se qualcosa è intuitivo è probabilmente piuttosto soggettivo. Ma per linguaggi che sono altrimenti simili a PHP, la norma è passare oggetti per riferimento. Per quanto riguarda OOP, direi che è il modo più intuitivo, dal momento che OOP riguarda l'incapsulamento dello stato, quindi i programmi di solito si riferiscono a quello stato, piuttosto che clonarlo.
troelskn,

4

Questo è spesso noto in PHP come Restituzione di riferimento o Restituzione per riferimento .

La restituzione 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 quando hai un valido motivo tecnico per farlo.

Documentazione PHP sul riferimento di ritorno

Un riferimento in PHP è semplicemente un altro nome assegnato al contenuto di una variabile. I riferimenti PHP non sono come puntatori nella programmazione C , non sono indirizzi di memoria reali, quindi non possono essere utilizzati per l'aritmetica dei puntatori.

Il concetto di restituzione di riferimenti può essere molto confuso soprattutto per i principianti, quindi un esempio sarà utile.

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

La funzione getPopulationCount()definita con una precedente &restituisce il riferimento al contenuto o al valore di $populationCount. Quindi, incrementando $countryPopulation, anche incrementi $populationCount.

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.