Que signifie démarrer une fonction PHP avec une esperluette?

129

J'utilise la bibliothèque Facebook avec ce code:

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

Que signifie le & au début de la définition de la fonction, et comment utiliser une bibliothèque comme celle-ci (dans un exemple simple)

Alex Mcp
la source

Réponses:

157

Une esperluette avant un nom de fonction signifie que la fonction renverra une référence à une variable au lieu de la valeur.

Le retour par référence est utile lorsque vous souhaitez utiliser une fonction pour trouver à quelle variable une référence doit être liée. N'utilisez pas le retour par référence pour augmenter les performances. Le moteur optimisera automatiquement cela de lui-même. Ne renvoyez les références que si vous avez une raison technique valable de le faire.

Voir Renvoyer les références .

Dominic Rodger
la source
1
Donc, sans entrer dans les détails, vous appelleriez (avec la classe instanciée) quelque chose comme $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? Je suppose que je ne suis pas sûr de la nuance ici, merci pour votre aide.
Alex Mcp
2
Ouais - j'appellerais ça comme ça.
Dominic Rodger
16

Il renvoie une référence, comme déjà mentionné. En PHP 4, les objets étaient attribués par valeur, comme toute autre valeur. Ceci est très peu intuitif et contraire au fonctionnement de la plupart des autres langages.

Pour contourner le problème, des références ont été utilisées pour les variables qui pointaient vers des objets. En PHP 5, les références sont très rarement utilisées. Je suppose que c'est du code hérité ou du code essayant de préserver la compatibilité ascendante avec PHP 4.

troelskn
la source
C'est la bibliothèque PHP officielle de Facebook, FWIW.
Alex Mcp
4
@Alex: Dans ce cas, ils le font probablement pour protéger les hackers occasionnels, qui utilisent php4, d'eux-mêmes. Vous ne devriez pas faire cela dans votre propre code - C'est obsolète.
troelskn
3
"C'est très peu intuitif et contraire à la façon dont la plupart des autres langues fonctionnent" Je ne pourrais pas être plus en désaccord.
Courses de légèreté en orbite
5
@WildlyInaccurate: attribuer des objets par référence par défaut, ce qui se passe dans .NET et en Java (je pense), est très peu intuitif. Dans la plupart des autres langages, l'affectation se fait par copie, que vous ayez un "objet" ou un primitif ou autre, et comme c'est le cas depuis la nuit des temps, c'est à cela que le monde aurait dû s'en tenir.
Courses de légèreté en orbite
4
Que quelque chose soit intuitif est probablement plutôt subjectif. Mais pour les langages qui sont par ailleurs similaires à PHP, la norme est de passer des objets par référence. En ce qui concerne la POO, je dirais que c'est la manière la plus intuitive, puisque la POO consiste à encapsuler l'état, donc les programmes feraient généralement référence à cet état, plutôt que de le cloner.
troelskn
4

Ceci est souvent connu en PHP comme Renvoi de référence ou Renvoi par référence .

Le retour par référence est utile lorsque vous souhaitez utiliser une fonction pour trouver à quelle variable une référence doit être liée. N'utilisez pas le retour par référence pour augmenter les performances. Le moteur optimisera automatiquement cela de lui-même. Ne renvoyez les références que si vous avez une raison technique valable de le faire.

Documentation PHP sur le renvoi de référence

Une référence en PHP est simplement un autre nom attribué au contenu d'une variable. Les références PHP ne sont pas comme des pointeurs dans la programmation C , ce ne sont pas des adresses mémoire réelles, elles ne peuvent donc pas être utilisées pour l'arithmétique des pointeurs.

Le concept de renvoyer des références peut être très déroutant, en particulier pour les débutants, un exemple sera donc 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 fonction getPopulationCount()définie avec un précédent &, retourne la référence au contenu ou à la valeur de $populationCount. Donc, incrémenter $countryPopulation, incrémente également $populationCount.

Elisha Senoo
la source