Pourquoi ne pas les fonctions de traitement de fonction telles que call_user_func () code> prend en charge les paramètres de passage par référence?
4 Réponses :
Voir ceci: P>
http: //hakre.wordpress.com/2011/03/09/call_user_func_array-php-5-3-and-passing-By-Reference/ p>
est-il possible Pour passer des paramètres par référence à l'aide de call_user_func_array ()? P>
http://bugs.php.net/bug.php?id = 17309 & Edit = 1 P>
Passer des références dans un tableau fonctionne correctement. P>
Merci! Je suis déjà conscient de cette solution de contournement; La question concerne pourquoi une telle solution est nécessaire en premier lieu.
Je mettrais mon argent sur la "décision de conception", plus non moins. Si je rencontre quelque chose d'intéressant sur ce sujet, je vais mettre à jour ma réponse.
Vous pouvez utiliser: p> pour obtenir le même effet que: p> Pour cette raison, je crois (sans fondement) que donner mon point de vue sur votre question actuelle "Pourquoi Il tombe probablement sous les mêmes lignes que "Pourquoi certaines méthodes sont-elles des méthodes C'est parce que PHP a été conçu, par de nombreuses personnes différentes, sur une longue période, et sans normes strictes en place à l'époque. p> Vous devez vous assurer de définir la variable à l'intérieur du tableau sur une référence également. P> Essayez ceci et prendre note du tableau devrait sortir: p> call_user_func code> est juste une coupe courte du compilateur. (c.-à-d. Il est remplacé par la dernière fois au moment de la compilation) P>
Call_user_func Code> est conçu pour fonctionner de cette façon?": P>
strtstr code> et d'autres
str_replace cod>?, pourquoi fonctionne des fonctions de tableau
Haystack, aiguille Code> et Fonctions de chaîne
Aiguille, Haystack Code>? P>
(& $ t) code> partie: p>
Merci! Mais ce que je veux savoir, ce n'est pas "Comment puis-je transmettre une référence via call_user_func", mais "Pourquoi est-ce que je dois sauter à travers des cerceaux pour obtenir une référence via Call_user_func?" La question concerne la conception de PHP, pas son utilisation.
@Will, lorsque vous ajoutez une chose à un tableau, PHP sera par défaut, copiez-la. Donc, afin de transmettre une gamme de références, vous devez d'abord ajouter des variables à un tableau en tant que références.
Merci, je comprends ça. J'ai édité la question de la clarifier.
@Will, j'ai mis à jour ma réponse pour refléter votre question mise à jour
Merci +1 de prendre le temps de mettre à jour votre réponse. Remarque, cependant, que call_user_func ("plus ', & $ compte) code> lancera un avertissement" Call-Time Pass-Référence a été obsolète - Argument passé par la valeur "Sauf indication_call_time_pass_reference dans php.ini est réglé sur ON.
La réponse est intégrée au fond de la manière dont les références fonctionnent dans le modèle PHP em> - pas nécessairement la mise en œuvre em>, car cela peut varier beaucoup, en particulier dans le 5.x versions. Je suis sûr que vous avez entendu les lignes, ils ne sont pas comme des indicateurs C, ni des références C ++, etc. Fondamentalement, lorsqu'une variable est attribuée ou liée, elle peut se produire de deux manières - soit par valeur (dans laquelle Case La nouvelle variable est liée à une nouvelle "boîte" contenant une copie de l'ancienne valeur) ou par référence (auquel cas la nouvelle variable est liée à la même zone de valeur que l'ancienne valeur). Ceci est vrai que nous parlons de variables, d'arguments de fonction ou de cellules dans les matrices. P>
Les choses commencent à être un peu poilues lorsque vous commencez à transmettre des références dans des fonctions - évidemment, l'intention est de pouvoir modifier les variables d'origine. Il y a assez de temps, il y a un peu de temps, le passage de l'appel-référence (la possibilité de transmettre une référence dans une fonction qui ne s'y attendait pas) a été obsolète, car une fonction qui ne savait pas qu'il s'agissait d'une référence pour une référence. 'Modifier l'entrée. Le prenant à un autre niveau, si cette fonction appelle une deuxième fonction, elle ne s'attendait pas à une référence ... alors tout finit par se faire déconnecter. Il pourrait em> travailler, mais cela n'est pas garanti et peut casser une version PHP. P>
Ceci est où L'explication la plus perspicace que j'ai vue (ce qui m'a aidé à me donner la tête autour des références) était dans un commentaire sur le manuel PHP 'Passer par référence': P>
http://ca.php.net/manual/ en / langue.references.pass.php # 99549 p>
Fondamentalement, la logique va comme ça. Comment écririez-vous votre propre version de Obtenez votre tête autour de cela et vous aurez une compréhension beaucoup plus profonde des références PHP (et une motivation beaucoup plus grande pour éviter que vous puissiez). P> call_user_funcunc () code> est entré. Supposons que vous transmettez une référence à celle-ci (et obtenez l'Avertissement associé à la transmission de temps d'appel). Ensuite, votre référence est liée à une nouvelle variable - les paramètres de
call_user_func () code> lui-même. Ensuite, lorsque votre fonction cible est appelée, ses paramètres sont pas em> liés à votre attente. Ils ne sont pas liés aux paramètres d'origine du tout. Ils sont liés aux variables locales situées dans la déclaration
call_user_func () code>.
call_user_func_array () code> nécessite également de la prudence. Mettre une référence dans une cellule Array pourrait avoir des problèmes - car PHP passe ce réseau avec une sémantique "Copy-on-écriture", vous ne pouvez pas être sûr que si le tableau ne sera pas modifié sous vous, et la copie n'obtiendra pas détaché de la référence d'origine. P>
call_user_func () code>? - Ensuite, expliquez comment cela se casse avec des références et la manière dont il échoue lorsque vous évitez que vous évitez de faire référence à la référence des délais. En d'autres termes, le moyen droit em> des fonctions d'appel (spécifier la valeur et laisser PHP décider de la déclaration de fonction s'il faut passer la valeur ou la référence) ne fonctionnera pas lorsque vous utilisez
call_user_funcunc () code> - Vous appelez deux fonctions profondes, la première par valeur et la seconde en référence aux valeurs du premier. p>
C'était très utile. Heureux que j'ai réexaminé cette question. Merci!
Une autre manière possible - la syntaxe de référence reste le «droit»:
Pour quiconque se demande,
call_user_func_array () code> avec un tableau de références fonctionne.