Page 1 sur 1

Limiter la portée d'une variable globale

Posté : 23 avr. 2008, 22:15
par dimalta5
Bonjour,

j'ai deux fichier A.php et B.php,

A.php contient un tableau de données:

Code : Tout sélectionner

$data['une clef']='une valeur'; $data['une clef 2']='une valeur 2';
B.php inclue A.php:

Code : Tout sélectionner

include 'A.php'; affiche('une clef 2');
mon problème est que le tableau $data est utilisé ailleur aussi de la même façon mais pour d'autres fichiers avec d'autres valeurs et parfois les clefs ce trouve être les même et l'une des deux est écrasée.

Y aurait t il un moyen de limiter la portée de $data?

Posté : 23 avr. 2008, 22:38
par Sékiltoyai
Si tu es en PHP 5.3 tu as les namespaces :)
Si tu n'es pas en PHP 5.3 tu peux aussi trouver des noms plus adaptés pour tes variables :)

Posté : 23 avr. 2008, 22:48
par dimalta5
Oui ça c'est vraiment une bonne nouvelle l'arrivée des namespaces mais est ce raisonnable de commencer à les utiliser dés maintenant car on trouve ça sur la doc:
"Namespaces are available in PHP as of PHP 5.3.0. This section is experimental and subject to changes."
(En plus on voit même des gens qui posent encore des questions sur Php4, 5.3.0 ça semble encore très loin d'eux :D )

Posté : 23 avr. 2008, 22:51
par Sékiltoyai
A ce moment là on n'évolue plus :)
Toujours est-il que tu as là selon moi les deux seules solutions légères à mettre en place. Si tu nous en dis plus sur ton problème peut être que l'on te trouvera une solution plus adaptée, mais là on ne peut te dire que cela…

Posté : 23 avr. 2008, 23:22
par dimalta5
Il s'agit de créer des fonctions d'internationalisation qui soient aussi simples à écrire que celle de gettext _() mais aussi facile à installer qu'une librairie php. Pour l'instant je suis arrivé à quelque chose qui marche assez bien:

Code : Tout sélectionner

function l($t){ global $L;return $L[$t]; } function include_translation($path){ $path=substr($path,LANG_ROOT_PATH_SIZE);//On supprime le debut du chemin car il change d'un serveur à l'autre $path=explode('/',$path); $file=array_pop($path); if(count($path)) $path='/D'.implode('/D',$path); else $path=''; return LANG_DIR.$path.'/F'.$file.'/'.LANG.'.php'; }
Chaque fichier à un fichier relatif contenant sa traduction dans une langue donnée, il suffit d'ajouter:

Code : Tout sélectionner

include include_translation(__FILE__);
au début d'un fichier à traduire et de mettre les phrases entre l("...") ce qui laisse le code très lisible.

ensuite avant d'uploader sur le serveur en production je remplace avec un script chaque clef textuelle par une clef numérique pour que ce soit rapide.

Je n'ai que ce problème de clefs qui sont parfois écrasées (rarement mais c'est possible) à régler avant de passer à l'ajout des fonctionnalités de gestion de pluriels et optimiser tout ça pour que ce soit parfait :D

Posté : 23 avr. 2008, 23:44
par AB
Oui ça c'est vraiment une bonne nouvelle l'arrivée des namespaces mais est ce raisonnable de commencer à les utiliser dés maintenant car on trouve ça sur la doc:
"Namespaces are available in PHP as of PHP 5.3.0. This section is experimental and subject to changes."
(En plus on voit même des gens qui posent encore des questions sur Php4, 5.3.0 ça semble encore très loin d'eux :D )
En fait tout dépend de ce que tu développe. Si c'est un script qui "part dans la nature" et sur lequel tu veux avoir une fiabilité maximum tout en ayant à intervenir un minimum par la suite, par prudence, je serais comme toi assez réservé. Par contre si c'est un script que tu vas suivre sur une longue période, cela change les données du problème.

Posté : 23 avr. 2008, 23:52
par Sékiltoyai
Tu peux utiliser (attention très laid) debug_backtrace() pour connaître le nom du fichier appelant dans la fonction l() ainsi que dans la fonction include_translation() et utiliser une classe pour stocker tes données et éviter que es tableaux se marchent dessus.

Une autre solution serait de rogner sur les fonctionnalités et demander que le nom du tableau ait une certaine forme ou bien que les clés soient uniques.

Posté : 24 avr. 2008, 00:27
par dimalta5
oui effectivement debug_backtrace() ça donne déjà l'info nécessaire mais bon j'imagine que ça va devenir ultra lourd si je l'appel dans l() pour chaque phrase à traduire de l'application.

pour ce qui est de la forme du tableau sinon je pensais à un tableau structuré de la façon suivante:

Code : Tout sélectionner

array( 'nom du fichier1'=>array( 'clef1'=>'valeur1', 'clef2'=>'valeur2', ... 'nom du fichier2'=>array( 'clef1'=>'valeur1', 'clef2'=>'valeur2', ... ... )
et chaque fichier langue vient ajouter une nouvelle clef 'nom du fichier', mais sans connaître le nom de fichier dans l() c'est pas utilisable... hélas