Limiter la portée d'une variable globale

Eléphant du PHP | 59 Messages

23 avr. 2008, 22:15

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?

ViPHP
ViPHP | 5924 Messages

23 avr. 2008, 22:38

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 :)

Eléphant du PHP | 59 Messages

23 avr. 2008, 22:48

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 )
Modifié en dernier par dimalta5 le 23 avr. 2008, 22:52, modifié 1 fois.

ViPHP
ViPHP | 5924 Messages

23 avr. 2008, 22:51

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…

Eléphant du PHP | 59 Messages

23 avr. 2008, 23:22

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

ViPHP
AB
ViPHP | 5818 Messages

23 avr. 2008, 23:44

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.

ViPHP
ViPHP | 5924 Messages

23 avr. 2008, 23:52

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.

Eléphant du PHP | 59 Messages

24 avr. 2008, 00:27

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