J'ai quelques connaissances en C ++ et je sais que les pointeurs y sont couramment utilisés, mais j'ai commencé à regarder le code open source PHP 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?
return array($foo, $bar);
etlist($A, $B) = foobar();
Réponses:
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 tableaux 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 en PHP ne sont pas des pointeurs. Puisque vous venez d'un arrière-plan C ++, je peux comprendre la confusion, mais les références PHP sont une bête entièrement différente, ce sont des alias d'une table de symboles . Les gains de performances que vous attendiez des références C ++ ne s'appliquent tout simplement pas aux références PHP.
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 de 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:
la source
f($obj)
étant donnéfunction f($x) { $x = new X; }
, aurait fait$obj
référence à un objet différent qu'avant l'appel àf()
. Cependant, comme les objets ne sont pas passés par référence, $ obj n'est pas modifié si vous l'exécutez avec PHP. De cette façon, PHP fait la même chose que Java.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 que PHP 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
en quelque chose d'autre, et donc de faire des copies défensives au cas où. (Il peut déjà modifier$i
si la valeur est un objet, mais à mon avis, il ne devrait pas.)Fondamentalement, je ne trouverais que le passage par référence utile pour les paramètres de "sortie", 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 modifient clairement l'objet passé, commesort
ouarray_pop
, cela semble un peu capricieux ... mais c'est ce avec quoi nous sommes coincés.la source
PHP est un langage orienté web.
Les pages Web sont servies rapidement et doivent être légères.
Le programme PHP habituel vit fraction de seconde et consomme quelques centaines de kilo-octets de mémoire.
Il n'y a aucune utilité pour de telles optimisations.
la source
Quelques raisons à la volée:
la source
Je pense que ce n'est qu'un choix des développeurs, rien à voir avec le langage. Beaucoup de code PHP (intégré et non) utilise des références. Jetez un oeil aux fonctions de tableau en PHP, beaucoup d'entre elles 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.la source
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.
la source
Je connais de nombreuses fonctions php qui le font. Jetez un œil
preg_match()
par exemple.$matches
sera transmis par référenceSi vous voulez écrire une fonction qui prend des arguments par référence, utilisez la syntaxe suivante
$ a et $ b sont passés par référence $ c est passé par valeur.
la source