JeuWeb - Crée ton jeu par navigateur
écraser une fonction (ou un alias) interne dans PHP - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : écraser une fonction (ou un alias) interne dans PHP (/showthread.php?tid=5796)



écraser une fonction (ou un alias) interne dans PHP - keke - 09-11-2011

Bonjour,

Je suis confronté a une question. Comment désactiver l'alias d'une fonction interne (se trouvant dans un module) ?

J'utilise la bibliothèque GETtext pour internationaliser mon jeu. Cette bibliothèque définit 1 fonctions :
gettext ($string)
et son alias
_($string)

Cela marche plutôt bien. Cependant, aujourd'hui, j'aimerais pour des tests, redéfinir l'alias de cette fonction.
ainsi, au lieu que _('bonjour') me renvoie 'hello' en anglais, je voudrais qu'elle me renvoie 'Chaine traduire : bonjour : RAS'
(ou un truc du genre.)

Je n'arrive pas à simplement re-définir la fonction :

function _($string)
{
return '';
}


J'ai fouillé mon php.ini, épluché la doc, tenté des rename_function, etc.

De même, j'ai essayé de mettre un namespace en tête de mon fichier main... ça a marché (hooo), mais uniquement pour le fichier main. Les autres fichiers inclus ne profite pas de la fonction.

En dernier recours, j'ai dégagé le module Gettext, re-défini ma fonction _() ainsi que toutes les autres (bindtextdomain, bind_textdomain_codeset et textdomain).
Ca marche ainsi ... mais bon, je suis bien loin de ma solution simple initiale consistant à désactiver un alias de fonction pour la redéfinir ensuite !

Kéké
PS : Mon but est de traquer les derniers éléments qui n'auraient pas encore été passé à la moulinette gettext. Je veux que les chaines de caractères traduite RESSORTE fortement.
(PS : internationalisation de Magdales = 60% pour fichier plat, 80% pour BDD)


RE: écraser une fonction (ou un alias) interne dans PHP - niahoo - 09-11-2011

Pour le namespace il te faut l'écrire explicitement quand tu veux utiliser la fonction dans tes autres fichiers il me semble. (je suis pas sur car j'utilise pas php 5.3 au boulot)

Est-ce que tu as essayé d'interdire la fonction dans ton php.ini puis de la définir ensuite dans ton code ?


disable_functions =_



RE: écraser une fonction (ou un alias) interne dans PHP - keke - 09-11-2011

(09-11-2011, 01:16 AM)niahoo a écrit : Pour le namespace il te faut l'écrire explicitement quand tu veux utiliser la fonction dans tes autres fichiers il me semble. (je suis pas sur car j'utilise pas php 5.3 au boulot)

Est-ce que tu as essayé d'interdire la fonction dans ton php.ini puis de la définir ensuite dans ton code ?


disable_functions =_

dommage pour le namespace alors ... j'ai plus de 800 fichiers, je ne compte pas rajouter à la main. Dommage qu'en l'ajoutant à mon fichier main.php (tout en haut, avant les premiers include) ça ne marche pas ^^. Peut-être est-il possible de faire un global namespace ? (j'ai zieuté la doc, mais sans résultat probant).

Concernant le disable_functions, oui j'ai testé effectivement. Ca désactive la fonction (for security reason), mais ça ne t'autorise pas à la redéfinir ensuite.

Si vous avez d'autres idées, je suis preneur !

Kéké


RE: écraser une fonction (ou un alias) interne dans PHP - niahoo - 09-11-2011

(09-11-2011, 12:31 AM)keke a écrit : En dernier recours, j'ai dégagé le module Gettext, re-défini ma fonction _() ainsi que toutes les autres (bindtextdomain, bind_textdomain_codeset et textdomain).
Ca marche ainsi ... mais bon, je suis bien loin de ma solution simple initiale consistant à désactiver un alias de fonction pour la redéfinir ensuite !

4 fonctions c'est pas la mort alors. ça me paraît pas impropre comme solution.


RE: écraser une fonction (ou un alias) interne dans PHP - keke - 09-11-2011

Le problème de cette méthode, c'est qu'elle n'est pas utilisable en prod par exemple, sans compter que basiquement, je ne sais toujours pas comment redéfinir une fonction de base.

Mais je reconnais que c'est la solution la plus efficace que j'ai trouvé ^^.

Kéké