Simple question sur 'global' dans une fonction

Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
- - Dernière réponse : abdoulax
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012
- 17 juin 2012 à 09:44
Bonjour à tous,
Etes vous adepte de mettre toutes les variables qui doivent être appelées en global tout de suite dans le corps d'une fonction ou est-ce que cela vous gène que cette 'commande' soit appelée quand on en a besoin ?
Exemple:
function blabla(){
 global $var1,$var2;
 [blabla]
 echo $var1;
 [blabla]
 echo $var2;
}


ou

function blabla2(){
 [blabla]
 global $var1;
 echo $var1;
 [blabla]
 global $var2;
 echo $var2;
}

Merci de vos retours.
S.
Afficher la suite 

12 réponses

Messages postés
72
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
25 juillet 2013
1
0
Merci
Ce qui me gène c'est surtout de faire appel à des variables globales dans une fonction !


-------------------
Oderint dum metuant
Commenter la réponse de pmcoste
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012
0
Merci
syndrael, je crois que tu n'as pas comprit l'utilité du parametre global.

$test = 1;

function testA() {
 $test = 2;
 echo $test;
}
testA(); // display 2
echo $test; // display 1

function testB() {
 global $test;
 $test = 3;
 echo $test;
}
testB(); // display 3
echo $test; // display 3


J'espère qu'avec cette exemple tu comprends mieux.
Commenter la réponse de abdoulax
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012
0
Merci
Enfin si ca ce trouve tu avais déjà compris :p Mais comme dit pmcoste, l'utilisation de ce genre de pratique est à eviter. Cependant tu peux en avoir besoin et dans ce cas je te conseillerai de déclarer les variables globals au debut de la function.
Commenter la réponse de abdoulax
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
11
0
Merci
ouh là Aboulax, ton exemple me fait peur !!
Jamais je ne penserai à modifier une variable 'global' par cette méthode.. au mieux j'emploierai un passage par référence.
Pour moi une variable globale doit par principe conserver sa valeur, les effets peuvent être inattendus pour la suite.
Chacun son point de vue..
S.
Commenter la réponse de syndrael
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014
0
Merci
Bonjoir Syndrael,

Si une variable 'global' doit conserver sa valeur ET doit être disponible dans le scope global. Pourquoi ne pas déclarer une constante ? Ou alors j'ai mal compris.


________________________________________
( $toBe || !$toBe ) = $this->Question();
Commenter la réponse de inwebo
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
11
0
Merci
Ben non.. en l'occurence mes global sont des connexions SSH ou des ressources LDAP.. donc dur d'en faire des constantes, y compris via des sérialisations.
S.
Commenter la réponse de syndrael
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012
0
Merci
syndrael, inwebo a parfaitement raison. Enfin dans tous les cas, le plus simple c'est de ne pas utiliser de global et de se tourner sur un model object et l'utilisation de pattern ;-)
Commenter la réponse de abdoulax
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
11
0
Merci
inwebo a parfaitement raison

Ben non, puisque je ne peux pas mettre des ressources LDAP en constante.. LOL !!
Bon, on va re-situer le problème..
1. je ne code pas avec des global, pour moi c'est design pattern, singleton et tout le reste.
2. j'essaie de comprendre la façon de développer des certains produits comme Joomla, Wordpress et Egroupware entre autres..
3. des fois dans ces produits, je vois des usages de 'global' un peu abhérrants à mon goût et donc je vous consulte pour savoir si j'ai tort ou raison dans ma façon de développer en lisant le code des autres.
Donc non, je ne code avec des 'global' ou très rarement quand je ne peux pas faire de Singleton.
Je retourne à ma première question:
Etes vous adepte de mettre toutes les variables qui doivent être appelées en global tout de suite dans le corps d'une fonction ou est-ce que cela vous gène que cette 'commande' soit appelée quand on en a besoin ?

Ce n'est pas parce que je vous pose une question sur la cocaine ou l'héroine que je me drogue.. LOL !!
Tout cela est dit avec humour biensur, mais j'aime bien connaitre l'avis des collégues de ce forum.
Bon week-end pluvieux
S.
Commenter la réponse de syndrael
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11
0
Merci
Salut,

Ben non.. en l'occurence mes global sont des connexions SSH ou des ressources LDAP.. donc dur d'en faire des constantes, y compris via des sérialisations.

Perso je n'aime pas utiliser le mot clé global, je préfère largement l'usage de la variable super-globale $GLOBALS. Un "degré" d'array supplémentaire avec le nom du projet (afin de faire une sorte de namespace rudimentaire) et on évite toute collision. Exemple:
<?php
$GLOBALS['myproject']['db'] = new \PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');
?>


Ainsi:
- On ne se fais pas chier avec le mot-clé global.
- La variable est très clairement identifiée comme étant une globale, aucun risque de la confondre avec une variable locale et de faire des bêtises avec par inadvertance.
- Pas de risque de collision de globales.

Une petite précision pour finir : syndrael est quelqu'un d'expérimenté qui sais utiliser les globales avec parcimonie et uniquement lorsque ces dernières sont pleinement justifiée (c'est également ce que je fais mais ça on l'avais compris). Il y a de fortes chances pour que ce sujet soit lu par des gens moins expérimentés auxquels je recommande chaudement de ne pas utiliser de globales, faute de quoi ça risque d'entraîner des codes difficilement maintenables et donc totalement nazes.
Commenter la réponse de TychoBrahe
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
11
0
Merci
je recommande chaudement de ne pas utiliser de globales, faute de quoi ça risque d'entraîner des codes difficilement maintenables et donc totalement nazes

Tout à fait.. mais dans mon cas, je constate qu'on retrouve de plus en plus ce genre de pratiques dans des outils répandus, c'est un peu dommage.
Hier soir je me suis même demandé si je n'allais pas 'forker' un plug-ins Wordpress fonctionnellement très utile à cause de ce genre de maladresses.
Donc pour les débutants, nous les invitons à se renseigner sur les principes de super globales, de Singleton ou de Namespaces (présent depuis PHP 5.3, il me semble) au lieu de prendre de mauvaises habitudes..
Bon week end à tous..
S.
Commenter la réponse de syndrael
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
11
0
Merci
Pour ceux qui n'auraient pas compris mon questionnement un peu alambiqué voici un exemple: Wordpress
Sur la page Codex Wordpress
on peut lire
<?php global $more; $more = -1; //declare and set $more before The Loop ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); //begin The Loop ?>
<?php 
    if ($more == -1) { //do not use the more tag on the first one.
        the_content();
        $more = 0; //prevent this from happening again. use the more tag from now on.
    }
    else { //use the more tag
        the_content(__('Read more...'));
    }
?>
<?php endwhile; //end of The Loop ?>

Et là, moi je me dis: ouah.. c'est la fête du slip ici !! non ?? Un global en plein milieu d'une page de code.
Enfin bref..
S.
Commenter la réponse de syndrael
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012
0
Merci
Wordpress ont tourné leur application vers la simplicité. Ca peu paraitre abairant mais ca rend la creation de plugin accessible à tous et très rapidement (et aussi super performant). Par exemple, magento est super orienté object, codé sur un model java. Avec ce genre de framework tu peux péter serieusement un cable et de plus il y a des gros problème de performance.

Pour répondre à ta question, généralement les globals sont appelées au début d'une fonction (enfin de mon expèrience) et cela me parait plus logique.
Commenter la réponse de abdoulax