Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utilisation de $GLOBALS avec les tableaux

10 réponses
Avatar
oam
J'ai un ancien programme qui utilise de nombreuses fois l'instruction
"global" pour déclarer des variables globales dans le corps de fonctions.
Cette instruction ne fonctionne plus en PHP5. Je souhaite donc la remplacer
par la nouvelle instruction "$GLOBALS", mais je n'arrive pas à faire mieux
que cela quand je travaille sur des variables de type tableaux

exemple simple :
---------------

Imaginons que ma variable globale est le tableau suivant :
$taba=array("cleA"=>1,"cleB"=>2);

Je voudrais la manipuler dans une fonction quelconque illustrée par
l'exemple suivant :

function addition($val)
{
$tmp = $GLOBALS['taba'];
$tmp['cleA'] = $tmp['cleA'] + $val;
$GLOBALS['taba'] = $tmp;
}

mais je dois à chaque fois passer par une variable temporaire, car
$GLOBALS['taba['cleA']'] =$GLOBALS['taba['cleA']'] + $ val;
ne fonctionne pas !!!

Quelqu'un aurait-il une autre solution ?

Merci d'avance.

10 réponses

Avatar
Olivier Miakinen

[ je dois faire ceci ]

$tmp = $GLOBALS['taba'];
$tmp['cleA'] (*)

[ car cela ne fonctionne pas ]
$GLOBALS['taba['cleA']']


Si tu remplaces « $tmp » par « $GLOBALS['taba'] » sur la ligne repérée
par (*), tu penses que cela doit donner « $GLOBALS['taba['cleA']'] » ?

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.

Avatar
oam
Précision : Le warning que j'ai en utilisant l'instruction "global" avec
PHP5 est la suivante :

"Warning: Unknown: Your script possibly relies on a session side-effect
which existed until PHP 4.2.3. Please be advised that the session extension
does not consider global variables as a source of data, unless
register_globals is enabled. You can disable this functionality and this
warning by setting session.bug_compat_42 or session.bug_compat_warn to off,
respectively. in Unknown on line 0"

et donc c'est pour cette raison que j'essaye d'utiliser les variables
superglobals pour faire disparaitre ces warnings quand j'utilise des
sessions en partant du principe que le problème vient de là...

Si vous avez une autre idée... n'hésitez pas !!!
Avatar
bruno modulix
oam wrote:
(snip)
$GLOBALS['taba['cleA']'] =$GLOBALS['taba['cleA']'] + $ val;
ne fonctionne pas !!!

Quelqu'un aurait-il une autre solution ?


Lire le Joli Manuel, et réécrire ça avec la Bonne Syntaxe(tm) ?

Allez, je suis dans un bon jour:
$GLOBALS['taba']['cleA']


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Guillaume Bouchard
oam wrote:
J'ai un ancien programme qui utilise de nombreuses fois l'instruction
"global"


Haa, Vade Retro !

pour déclarer des variables globales dans le corps de fonctions.
Cette instruction ne fonctionne plus en PHP5.


Tu m'etonnes que peut.

Je souhaite donc la remplacer
par la nouvelle instruction "$GLOBALS",


Erreur de conception AMHA. Repete après moi, les Globals c'est mal (tm)

function addition($val)
{
$tmp = $GLOBALS['taba'];
$tmp['cleA'] = $tmp['cleA'] + $val;
$GLOBALS['taba'] = $tmp;
}


Pourquoi pas

function addition($val,$truc){
return $val + $truc;
}

$taba['cleA'] = addition($val,$taba['cleA']);

Tu peux aussi voir du coté du passage par réference, utile dans certains
cas.

mais je dois à chaque fois passer par une variable temporaire, car
$GLOBALS['taba['cleA']'] =$GLOBALS['taba['cleA']'] + $ val;
ne fonctionne pas !!!


RTFM !

Reprenons le code plus haut :

$tmp = $GLOBALS['taba'];
$tmp['cleA']


Avec un manipulation subtile, tu obtiens

$GLOBALS['taba']['cleA']

ce qui est la seule méthode pour accedé à des tableaux de tableaux.

--
Guillaume. J - 3.

Avatar
oam
$tmp = $GLOBALS['taba'];
$tmp['cleA'] (*)

[ car cela ne fonctionne pas ]
$GLOBALS['taba['cleA']']


Si tu remplaces « $tmp » par « $GLOBALS['taba'] » sur la ligne repérée
par (*), tu penses que cela doit donner « $GLOBALS['taba['cleA']'] » ?


Désolé mais j'ai rien compris... à ce que tu voulais dire.


Avatar
oam
"bruno modulix" a écrit dans le message de news:
42aef02d$0$8908$
oam wrote:
(snip)
$GLOBALS['taba['cleA']'] =$GLOBALS['taba['cleA']'] + $ val;
ne fonctionne pas !!!

Quelqu'un aurait-il une autre solution ?


Lire le Joli Manuel, et réécrire ça avec la Bonne Syntaxe(tm) ?

Allez, je suis dans un bon jour:
$GLOBALS['taba']['cleA']


Autant pour moi, je vais donc de ce pas acheter une nouvelle Bible ;-)


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"



Avatar
oam
"Guillaume Bouchard" a écrit dans le message de
news: d8mqlh$km3$
oam wrote:
J'ai un ancien programme qui utilise de nombreuses fois l'instruction
"global"


Haa, Vade Retro !


OUI


pour déclarer des variables globales dans le corps de fonctions.
Cette instruction ne fonctionne plus en PHP5.


Tu m'etonnes que peut.

Je souhaite donc la remplacer par la nouvelle instruction "$GLOBALS",


Erreur de conception AMHA. Repete après moi, les Globals c'est mal (tm)


Je sais, mais le source à modifier est long, très long, très très long...
(plus de 20.000 lignes) donc je voudrais dans un premier temps aller au plus
vite donc juste modifier ce qui ne va pas pour le rendre compatible PHP5,
après je suis d'accord, on vire les GLOBAL !!!

function addition($val)
{
$tmp = $GLOBALS['taba'];
$tmp['cleA'] = $tmp['cleA'] + $val;
$GLOBALS['taba'] = $tmp;
}


Pourquoi pas

function addition($val,$truc){
return $val + $truc;
}

$taba['cleA'] = addition($val,$taba['cleA']);



Evidemment c'est le plus propre (mais voir remarque précédente).

Tu peux aussi voir du coté du passage par réference, utile dans certains
cas.


c'est à dire ?


mais je dois à chaque fois passer par une variable temporaire, car
$GLOBALS['taba['cleA']'] =$GLOBALS['taba['cleA']'] + $ val;
ne fonctionne pas !!!


RTFM !

Reprenons le code plus haut :

$tmp = $GLOBALS['taba'];
$tmp['cleA']


Avec un manipulation subtile, tu obtiens

$GLOBALS['taba']['cleA']

ce qui est la seule méthode pour accedé à des tableaux de tableaux.


Là il faut que je révise !!!!


--
Guillaume. J - 3.


MERCI.


Avatar
P'tit Marcel
oam wrote:
Précision : Le warning que j'ai en utilisant l'instruction "global" avec
PHP5 est la suivante :

"Warning: Unknown: Your script possibly relies on a session side-effect
which existed until PHP 4.2.3. Please be advised that the session extension
does not consider global variables as a source of data, unless
register_globals is enabled. You can disable this functionality and this
warning by setting session.bug_compat_42 or session.bug_compat_warn to off,
respectively. in Unknown on line 0"


Indépendamment des réponses déjà données, J'ajouterais que le message
n'indique pas que la directive "global" n'est plus supportée par php5,
heureusement d'ailleurs, on va pas se laisser avoir par les ayatollahs
de l'Objet ;-)

Je suppose que tes scripts n'exploitent pas cette faille de php 4.1 donc
pour ne plus être emmerdé et revenir à un fonctionnement standard, il te
suffit a priori de définir dans la config :

session.bug_compat_42 0

eça
--
P'tit Marcel

Avatar
oam
Je suppose que tes scripts n'exploitent pas cette faille de php 4.1 donc
pour ne plus être emmerdé et revenir à un fonctionnement standard, il te
suffit a priori de définir dans la config :

session.bug_compat_42 0


Je m'y refuse. Je veux résoudre le problème.

Avatar
P'tit Marcel
oam wrote:
session.bug_compat_42 0


Je m'y refuse. Je veux résoudre le problème.


en mettant cette directive à Off, tu élimines un bug de PHP. C'est
contraire à tes principes ?