OVH Cloud OVH Cloud

[Q] Basique : array globale

19 réponses
Avatar
ASM
Salutatous,

Soit un array
$truc = array();

Soit une fonction

function trouve($quoi) {
$i = 0;
foreach($truc as $element)
if($element == $quoi) $i++;
echo "trouve $i element(s)";
}

comment je fais comprendre à trouve()
d'utiliser l'array $truc ?

bien entendu sans passer cet array en argument

j'ai essayé
foreach($GLOBALS['$truc'] as $element)
ça n'a pas l'air de fonctionner

--
Stephane Moriaux et son [moins] vieux Mac

9 réponses

1 2
Avatar
ASM
Tu sais que les globales sont EVIL(tm) ?


Heu ?

Ou bien c'est de l'humour, ou bien c'est du chinois
Bref j'ai pô compris.


Il veut juste dire que c'est pô bien !


Je pensais bien que si ce n'était de l'humour, ce voulait dire qque
chose du genre.
Mais là j'en ai besoin et indépendamment de toute "bonne" habitude.

Après, dans le cas général, je ne vois pas pourquoi ce serait si mal.
En principe, si on utilise une globale, c'est pour éviter de la
ré-inventer à chaque tour de roue et qu'on en a moultement l'usage.

--
Stephane Moriaux et son [moins] vieux Mac



Avatar
ASM


Tu sais que les globales sont EVIL(tm) ?



j'ai pô compris.


Il veut dire qu'il vaut mieux s'abstenir d'utiliser de variables
globales et que les passer en paramètres est mieux pour de raisons de
sécurité mais aussi pour éviter des bugs incompréhensibles quand on
s'enmêle les pinceaux et qu'on sait plus d'ou vient une variable.
De même il vaut mieux pour les variables de formulaire ou url utiliser
$_REQUEST['mavariable'] et pour la session $_SESSION['mavariable']


C'est un cas un peut particulier : la 'variable' est un 'array'
L'array (assez important, à double niveau et clés nominatives) en
question est servi à toutes les sauces de toutes les fonctions de la page.
Je trouve un peu bêtasse de devoir le passer systématiquement en argument.

Quant au $_REQUEST, oui bien sûr.
Et même je passe tout en POST dès que je peux. J'espère que ce n'est pas
mal faire ? que ça ne surcharge pas navigateur et/ou serveur ?

--
Stephane Moriaux et son [moins] vieux Mac




Avatar
ASM
ASM wrote:




d'utiliser l'array $truc ? bien entendu sans passer cet array en
argument


Tu sais que les globales sont EVIL(tm) ?


Heu ?

Ou bien c'est de l'humour, ou bien c'est du chinois


Non, de l'anglais.


Donc ce n'était pas une abréviation.

Bref j'ai pô compris.


Evil : Maléfique. Au sens fort.


et md ?

Les variables globales sont nocives. Elles introduisent un couplage fort
(ta fonction dépend d'une variable globale, on ne peut donc pas
l'utiliser si cette variable n'existe pas), entrainent des bugs
difficiles à tracer (que se passe-t-il, dans ton code, si un fichier
inclus définit une autre globale avec le même identifiant ?).

Et encore, dans ton exemple, la variable est utilisée en lecture seule...


oui, et elle est utilisée telle que et sans modif dans moult fonctions.
Elle est la base de référence et de travail de tout le reste.
En son absence tout ce qui suit n'a aucun interet, et rien ne fonctionnera.

A propos :
cet array est reconstruit à chaque appel de la page à partir d'un
fichier de 800 lignes et 9 éléments par lignes, le tout en mode texte brut.
Gagnerais-je à faire écrire tout l'array dans un fichier qui ne serait
donc qu'à lire (include) sans trituration pour mise en array, sachant
qu'ansi ce fichier serait alors beaucoup plus lourd (800 répétitions des
9 clés nominatives)

Il est parfois difficile de les éviter (surtout dans un langage comme
PHP qui n'a pas de notion de module et/ou d'espace de nommage), mais ça
ne devrait pas être une pratique courante, et, quand c'est inévitable,
il vaut mieux prendre des précautions pour éviter les problèmes (par
exemple: convention de nommage pour éviter les conflits de noms, et
avoir la définition de la globale et toutes les fonctions l'utilisant
dans le même fichier).


Ha! je suis dans le correct alors :-)


--
Stephane Moriaux et son [moins] vieux Mac




Avatar
Olivier Miakinen

function trouve($quoi)
{
global $truc;

$i = 0;
foreach($truc as $element) {
if ($element == $quoi) $i++;
}


je vois que tu me corriges mon foreach() avec des { }
c'est obligatoire ces { } ?


Absolument pas. C'est juste une pratique de programmation que j'ai
adoptée en C, puis conservée en PHP et en JavaScript, pour éviter de
bêtes bugs incompréhensibles quand -- par exemple -- on veut rajouter
des traces.


Cas d'école. Tu as ceci :

foreach($truc as $element) {
if ($element == $quoi) $i++;
}

Pour rajouter une trace, pas de problème (je suppose que la fonction
trace() fait ce qu'il faut) :

foreach($truc as $element) {
trace("element = $element");
if ($element == $quoi) $i++;
}

Si à la place tu avais cela :

foreach($truc as $element)
if ($element == $quoi) $i++;

À moins de faire très gaffe tu te retrouves avec :

foreach($truc as $element)
trace("element = $element");
if ($element == $quoi) $i++;

... et bien évidemment tout foire. (Au passage, « faire gaffe », cela
veut dire rajouter les accolades manquantes, alors moi je préfère les
avoir mises dès le départ.)



Note que je j'aurais fait aussi pour le if() si l'instruction avait été
sur la ligne suivante. C'est-à-dire que je peux écrire ceci :
if ($element == $quoi) $i++;
ou cela :
if ($element == $quoi) {
$i++;
}
mais jamais cela :
if ($element == $quoi)
$i++;


Cordialement,
--
Olivier Miakinen


Avatar
ASM
*ASM* @ 24/05/2006 11:34 :


Une manière de faire consiste à déclarer au début de la fonction que
$truc est une variable globale :


C'est complètement à l'envers du JavaScript :-(


J'déteste le Javascript :-( toutes les variables y sont globales ??


Ha bon ? ça vient de sortir ?
ou bien est-ce une réelle question ?

--
Stephane Moriaux et son [moins] vieux Mac



Avatar
ASM

function trouve($quoi) {
$i = 0;
foreach($truc as $element)
if($element == $quoi) $i++;
echo "trouve $i element(s)";
}


Sans répondre directement à ta question, moi j'utiliserais bien:

$i = count(array_keys($truc,$quoi));


bon ! une 3013 ième fonction ajoutée au 3012 déjà existantes ! :-)
J'irais jeter un oeil chez php.net. J'ai idée que ça doit pouvoir servir.

Mais, en effet, l'objet n'était pas là du tout.
J'ai juste essayé de faire un exemple court de ce que je voulais
(un dessin etant touj mieux que de longues explications), la finalité de
la fonction n'étant que pour la clore.

--
Stephane Moriaux et son [moins] vieux Mac


Avatar
Florian Sinatra
*ASM* @ 25/05/2006 00:41 :
*ASM* @ 24/05/2006 11:34 :


Une manière de faire consiste à déclarer au début de la fonction que
$truc est une variable globale :


J'déteste le Javascript :-( toutes les variables y sont globales ??



Ha bon ? ça vient de sortir ?
ou bien est-ce une réelle question ?


Ben les ?? dénotent une question, oui. Que veux-tu dire par "C'est
complètement à l'envers du JavaScript :-(" ??




Avatar
ASM
*ASM* @ 25/05/2006 00:41 :

Une manière de faire consiste à déclarer au début de la fonction que
$truc est une variable globale :


J'déteste le Javascript :-( toutes les variables y sont globales ??



Ha bon ? ça vient de sortir ?
ou bien est-ce une réelle question ?


Ben les ?? dénotent une question, oui. Que veux-tu dire par "C'est
complètement à l'envers du JavaScript :-(" ??


En JS (comme en de nombreux autres langages à ce que j'ai cru entendre)
les variables sont globales si on ne précise pas le contraire.
Elles sont alors accessibles partout sur la page sans autre artifice et
de manière naturelle puisqu'elles sont *globales*

C'est tout de même assez extraordinaire qu'en PHP il faille préciser
qu'on s'adresse à la globalité comme si c'était une redécouverte à
chaque fois.

Le pire c'est que sur le site php.net, ils ont tellement peur qu'on ose
s'en servir qu'il faut vraiment savoir s'y prendre pour avoir cette info
quant à l'acces à la globalité depuis une fonction.

--
Stephane Moriaux et son [moins] vieux Mac





Avatar
Thomas Labourdette
ASM a écrit le Jeudi 25 Mai 2006 19:51 :

[La doc sur le mot clé global]

Le pire c'est que sur le site php.net, ils ont tellement peur qu'on ose
s'en servir qu'il faut vraiment savoir s'y prendre pour avoir cette info
quant à l'acces à la globalité depuis une fonction.



L'information se trouve pourtant facilement, comme pour n'importe quel
langage, dans la partie "Référence du langage/Les variables/Portée des
variables"
http://www.php.net/manual/fr/language.variables.scope.php

@+

--
Terry DIKUL (signature et citation aléatoires)
Que faut-il faire quand une poupée gonflable a les yeux blancs?
La vider.

1 2