Existe-t-il un moyen de résoudre facilement ce problème ou ai-je vraiment besoin de réécrire tout le code hérité?
PHP Fatal error: Call-time pass-by-reference a été supprimé dans ... sur la ligne 30
Cela se produit partout car les variables sont passées dans les fonctions comme références dans le code.
Réponses:
Vous devez désigner l'appel par référence dans la définition de la fonction, pas l'appel réel. Depuis que PHP a commencé à afficher les erreurs de dépréciation dans la version 5.3, je dirais que ce serait une bonne idée de réécrire le code.
De la documentation :
Par exemple, au lieu d'utiliser:
Utilisation:
la source
E_COMPILE_WARNING
erreur de niveau, pour référence: php.net/manual/en/…Pour tous ceux qui, comme moi, lisent ceci parce qu'ils ont besoin de mettre à jour un projet hérité géant vers la version 5.6: comme le soulignent les réponses ici, il n'y a pas de solution rapide: vous avez vraiment besoin de trouver chaque occurrence du problème manuellement et de le corriger .
Le moyen le plus pratique que j'ai trouvé pour trouver toutes les lignes problématiques dans un projet (à moins d'utiliser un analyseur de code statique complet, qui est très précis mais je n'en connais aucun qui vous amène immédiatement à la bonne position dans l'éditeur) utilisait Visual Studio Code, qui a un joli linter PHP intégré, et sa fonction de recherche qui permet une recherche par Regex. (Bien sûr, vous pouvez utiliser n'importe quel éditeur IDE / Code pour cela qui effectue des recherches PHP linting et Regex.)
En utilisant cette expression régulière:
il est possible de rechercher dans tout le projet la présence de
&$
uniquement dans les lignes qui ne sont pas une définition de fonction.Cela se révèle encore beaucoup de faux positifs, mais cela rend le travail plus facile.
Le navigateur de résultats de recherche de VSCode facilite la navigation et la recherche des lignes incriminées: il vous suffit de cliquer sur chaque résultat et de rechercher celles que le linter souligne en rouge. Ceux que vous devez réparer.
la source
(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
PHP et les références ne sont pas intuitives. Si elles sont utilisées correctement, les références aux bons endroits peuvent améliorer considérablement les performances ou éviter des solutions de contournement très laides et un code inhabituel.
Ce qui suit produira une erreur:
Aucun de ceux-ci ne doit échouer car ils pourraient suivre les règles ci-dessous mais ont sans aucun doute été supprimés ou désactivés pour éviter beaucoup de confusion héritée.
S'ils ont fonctionné, les deux impliquent une conversion redondante en référence et la seconde implique également une conversion redondante en une variable contenue de portée.
Le second était auparavant possible, permettant de passer une référence à du code qui n'était pas destiné à fonctionner avec des références. C'est extrêmement moche pour la maintenabilité.
Cela ne fera rien:
Plus précisément, il transforme la référence en une variable normale car vous n'avez pas demandé de référence.
Cela fonctionnera:
Cela montre que vous passez une non-référence mais que vous voulez une référence, la transforme donc en référence.
Cela signifie que vous ne pouvez pas passer une référence à une fonction où une référence n'est pas explicitement demandée pour en faire l'un des rares domaines où PHP est strict sur les types de passage ou dans ce cas plus d'un type méta.
Si vous avez besoin d'un comportement plus dynamique, cela fonctionnera:
Ici, il voit que vous voulez une référence et que vous avez déjà une référence, alors laissez-le tranquille. Il peut également enchaîner la référence mais j'en doute.
la source