30 votes

Comment éviter l'erreur obsolète de passage par référence en temps d'appel en PHP?

Je suis en train de réduire les mises en garde qui sont envoyés à mon serveur apache journal.

Un avertissement est:

Call-time pass-by-référence a été supprimée.

Il est difficile pour moi d'imaginer pourquoi il était obsolète car il est un utile de programmation, en gros je fais ceci:

public function takeScriptsWithMarker(&$lines, $marker) {

    ...
}

et j'ai appeler cette fonction à plusieurs reprises d'obtenir des résultats de recul et de traitement, mais aussi de laisser le tableau $lignes construire en étant envoyé dans cette méthode à plusieurs reprises.

  1. Pour reprogrammer ce seraient considérables.
  2. Je ne veux pas juste "désactiver les avertissements" depuis que j'ai envie de voir d'autres mises en garde.

Donc, en tant que call-by-reference est obsolète, qu'est-ce que le "moyen" pour atteindre la fonctionnalité de ce modèle: à savoir de l'envoi d'un tableau de chaînes de caractères dans une méthode, demandez-leur d'être changé par la méthode, puis en continuant à utiliser ce tableau?

52voto

Ionuț G. Stan Points 62482

En fait, il n'y a aucun problème avec la façon dont vous définissez la fonction. Est un problème avec la façon dont vous appelez la fonction. Donc, pour votre exemple, au lieu de l'appeler comme:

 takeScriptsWithMarker(&$lines, $marker);
 

Vous l'appeleriez comme:

 takeScriptsWithMarker($lines, $marker); // no ampersands :)
 

La fonctionnalité est donc toujours disponible. Mais je ne connais pas la raison de ce changement.

9voto

Jason Points 1478

comme indiqué ci-dessus dans une réponse précédente, le problème est au moment de l'appel, pas au moment de la définition .. vous pouvez donc définir une fonction comme:

 function foo(&$var1,$var2,$var3=null){
    // procesing here
}
 

puis appelez comme:

 $return = foo($invar1,$invar2);
 

votre premier invar est passé par référence, le second ne l'est pas.

l'erreur apparaît lorsque vous essayez d'appeler comme ceci:

 $return = foo(&$invar1,$invar2);
 

6voto

Otto Allmendinger Points 11853

Vous pouvez définir allow_call_time_pass_reference sur true dans votre fichier php.ini . Mais c'est un hack.

1voto

jetboy Points 145

Vous pouvez passer un tableau avec une référence dans:

 public function takeScriptsWithMarker(array(&$lines, $marker))
 

qui ne devrait prendre qu'une petite quantité de refactoring à l'autre bout.

0voto

seanmonstar Points 5011

Vous pouvez passer dans le tableau, le laisser le manipuler, puis le "retourner", au lieu de jouer avec la référence d'origine. Il ne devrait pas être trop difficile d'inclure simplement un retour et une affectation.

 public function takeScriptsWithMarker($lines, $marker) {
    //...
    return $lines;
}
 

Usage:

 $lines = takeScriptsWithMarker($lines, $marker);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X