PHP 5.4 : Strict Standards: Only variables should be

Vos idées et demandes pour la prochaine mise à jour du script sont les bienvenues ici - Your ideas and suggestions for the next update.

Modérateurs : boulmontjj, Pierre G., Malabar, Otomatic

Otomatic
Modérateur
Modérateur
Messages : 677
Inscription : Ven 11 Août 2006, 09:33
Localisation : Paris
Contact :

PHP 5.4 : Strict Standards: Only variables should be

Messagepar Otomatic » Sam 16 Juin 2012, 17:47

Bonjour,

Toujours dans le cadre du déverminage pour les générations futures, je continue mes essais avec Apache 2.4.2, PHP 5.4.3 et MySQL 5.5.25.
Un point essentiel à prendre en considération est que la branche 5.4 de PHP est beaucoup plus sévère sur le mode STRICT que l'est la branche 5.3.
Par exemple, ma première page du Livre d'Or ne présente ni erreur, ni avertissement, mais, au fil des déplacements de page en page, on obtient des avertissements du style :

Strict Standards: Only variables should be passed by reference in G:\www\aviatechno\livre_or\index.php on line 665


leur nombre étant fonction du nombre de réponses du Webmestre dans la page considérée :
- Pas de réponse -> pas d'avertissemsnt
- Une réponse -> un avertissement
- X réponses -> X avertissements

Bizarre !
Moi, j'ai dit bizarre, bizarre, comme c'est étrange ! Pourquoi aurais je dit bizarre, bizarre ?
Louis Jouvet n'étant plus, je vais décortiquer cette bizarrerie à sa place.

La ligne 665 (De mon fichier index.php) est :

Code : Tout sélectionner

         $echo_html -> MxText("bloc_corps_messages.bloc_reponse.reponse", replace_censure_smileys(trim($alex_livre_messages_reponse[$i]), false));

A priori, rien de bizarre, ni d'insolite, ni même d'extraordinaire, rien que du code classique, normal.
Allons voir la fonction fonction replace_censure_smileys :

Code : Tout sélectionner

   function replace_censure_smileys(&$texte, $censure=true){...

Ah ! Le premier paramètre est passé par référence (& devant la variable), et non pas par valeur.
La fonction va chercher à remplacer (passage par référence) non pas l'élément de tableau $alex_livre_messages_reponse[$i] mais la fonction trim($alex_livre_messages_reponse[$i]) et ce n'est pas autorisé, bien que ça fonctionne (plus ou moins bien).
Ce comportement tout à fait légitime ne date pas d'hier. Il a été introduit en PHP 5.0.5 afin d'éviter des corruptions mémoires. On peut certainement mieux comprendre ce risque en se souvenant de la différence significative entre les pointeurs et les références du C.

Ce problème est très simple à corriger en modifiant le fichier fichier agb\index.php

Remplacer :

Code : Tout sélectionner

         $echo_html -> MxText("bloc_corps_messages.bloc_reponse.reponse", replace_censure_smileys(trim($alex_livre_messages_reponse[$i]), false));

par

Code : Tout sélectionner

         //modif oto - Suppression avertissement Strict Standards PHP 5.4.x
         $alex_livre_messages_reponse[$i] = trim($alex_livre_messages_reponse[$i]);
         $echo_html -> MxText("bloc_corps_messages.bloc_reponse.reponse", replace_censure_smileys($alex_livre_messages_reponse[$i], false));


Et voilou :P Pour servir et valoir ce que de droit. Les Malgaches disent « Pour que l'on s'en serve selon son droit » qui me plaît mieux.
Dernière édition par Malabar le Mer 20 Mars 2013, 08:34, édité 1 fois.
Ce n'est pas par ce que l'erreur se propage qu'elle devient vérité. Gandhi

Revenir vers « Suggestions d'amélioration du script »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité