web-dev-qa-db-fra.com

Pourquoi les références sont-elles rarement utilisées en PHP?

J'ai quelques connaissances en C++ et je sais que les pointeurs y sont couramment utilisés, mais j'ai commencé à regarder PHP code open source et je ne vois jamais de code utilisant des références dans les méthodes.

Au lieu de cela, le code utilise toujours une valeur de retour au lieu de transmettre la référence à la variable à la méthode, qui modifie ensuite la valeur de cette variable et la renvoie simplement.

J'ai lu que l'utilisation de références utilise moins de mémoire, alors pourquoi ne sont-elles pas utilisées en PHP?

26
Alexander Cogneau

Votre affirmation selon laquelle les références sont rarement utilisées est incorrecte. Comme d'autres l'ont déjà mentionné, il existe une tonne de fonctions natives qui utilisent des références, des exemples notables incluent les fonctions de tri de tablea et preg_match()/preg_match_all(). Si vous utilisez l'une de ces fonctions dans votre code, vous utilisez également des références.

En passant, les références dans PHP ne sont pas des pointeurs . Puisque vous venez d'un arrière-plan C++, je peux comprendre le confusion, mais PHP sont une bête entièrement différente, ce sont des alias d'un table des symboles . Tout gain de performances que vous auriez pu attendre des références C++ ne s'applique tout simplement pas à PHP références.

En fait, dans la plupart des scénarios, le passage par valeur est plus rapide et moins gourmand en mémoire que le passage par référence. Le moteur Zend, le noyau de PHP, utilise un mécanisme d'optimisation copie sur écriture qui ne crée pas de copie d'une variable tant qu'elle n'est pas modifiée. Le passage par référence rompt généralement le modèle de copie sur écriture et nécessite une copie, que vous modifiiez ou non la valeur.

N'ayez pas peur d'utiliser des références en PHP quand vous en avez besoin, mais ne le faites pas simplement comme une tentative de micro-optimisation. N'oubliez pas, l'optimisation prématurée est la racine de tout mal .

Lectures complémentaires:

49
yannis

PHP fait déjà une chose de copie sur écriture où il ne crée pas de nouvelle valeur jusqu'à ce que vous changiez quelque chose, donc il n'y a pas beaucoup de mémoire économisée en utilisant des références. Cela peut même perturber certaines choses PHP le fait en interne pour réduire l'utilisation de la mémoire, ce qui aggrave encore les choses.

Ajoutez à cela le fait que les références rendent les choses un peu trop magiques en général. La valeur par défaut, et donc ce que la plupart des gens attendent, est la valeur de passage; quand je passe $i à une fonction, cela complique énormément les choses de devoir se soucier si cette fonction change mystérieusement $i vers autre chose entièrement, et donc faire des copies défensives au cas où. (Il peut déjà modifier $i si la valeur est un objet, mais à mon avis, elle ne devrait pas l'être.)

Fondamentalement, je ne trouverais que le passage par référence utile pour les paramètres "out", ce qui signifie que les variables que je m'attends à récupérer de la fonction plutôt que de passer, a la preg_match's &$matches. Même pour les fonctions qui clairement modifient l'objet transmis, comme sort ou array_pop, c'est un peu capricieux ... mais c'est ce avec quoi nous sommes coincés.

8
cHao

PHP est un langage orienté web.
Les pages Web sont servies rapidement et doivent être légères.
Habituel PHP vit fraction de seconde et consomme quelques centaines de kilo-octets de mémoire.
Ces optimisations sont inutiles.

5
Your Common Sense

Quelques raisons à la volée:

  • PHP est un langage de script, et ne vise pas à être utilisé comme un logiciel embarqué de base (fondamentalement, la mémoire est effacée à la fin du script),
  • Depuis PHP5, le passage par référence est implicite pour les paramètres d'objet (donc PHP utilise le passage par référence "dans votre dos").
3
AlterPHP

Je pense que ce n'est qu'un choix des développeurs, rien à voir avec la langue. Beaucoup de PHP (intégré ou non) utilisent des références. Jetez un œil aux fonctions du tableau en PHP, beaucoup utilisent des références. preg_match utilise des références.

Je pense que l'une des raisons pour lesquelles les développeurs choisissent de ne pas utiliser de références est parce que cela peut être source de confusion. Vous appelez une fonction et l'une des variables peut (ou non) être mise à jour car il s'agissait d'une référence. Ainsi, lorsque vous déboguez, il peut ne pas être clair pourquoi la valeur de $x jsut a changé comme par magie.

2
Rocket Hazmat

Le problème fondamental de votre question est que vous supposez que cela est également courant en C++. Ce n'est pas le cas. Nous n'aimons pas les paramètres de sortie et les utilisons le moins possible - ils ne sont vraiment courants que dans les API de style C.

1
DeadMG

Je connais de nombreuses fonctions php qui le font. Jetez un œil à preg_match() par exemple. $matches sera transmis par référence

Si vous voulez écrire une fonction qui prend des arguments par référence, utilisez la syntaxe suivante

function byref(&$a, &$b, $c) {
    $a += $c;
    $b += $c;
    return $a * $b;
}

$ a et $ b sont passés par référence $ c est passé par valeur.

0
hek2mgl