8797 sujets

Développement web côté serveur, CMS

Bonjour,

Je me pose une question :

Il y certain cas ou l'on a besoin de variables globales par exemple quand on ne peut pas passer un paramétre a une fonction parceque la fonction depuis laquelle on appel celle-ci n'a pas cette variable.

Bien sûr cela peut se resoudre en construisant des modèles complexes de classes, mais ce n'est pas toujours facile à mettre en place et au final quelque fois plus lourd qu'une simple fonction.

je vous rassure, je fais trés peu appel aux variables globales, seulement dans quelque cas :

- un tableau "visitor", j'en ai tout le temp besoin, il ne change pas
- la variable "id_page", j'en ai aussi tout le temps besoin, et elle ne change pas nom plus, il vaut mieux pas...
- des variables level,hierarchy,sector qui me permette de définir la position de mes élements dans une arborescence, trés pratique.

Une alternative aux variables globales est l'utilisation du mot clé static et un peu plus complexe le pattern "singleton", qui permet de créer un classe unique. Seulement aprés avoir essayer sa mise en place dans plusieur cas, je me demande quand un tel manoeuvre est vraiment utile.

Voilà un premier exemple avec global :

class Visitor {

  var $visitor = array();
	
  function get_user(){
    return $this->visitor;
  }
  
  function verify_user(){
    $this->visitor['id'] = '1';
    $this->visitor['name'] = 'toto';
  }
}

$set_session1 = new Visitor();
$set_session1 -> verify_user();
$visitor = $set_session1 -> get_user();

function exemple1(){
  global $visitor;
  echo $visitor['name'];
}


La classe Visitor est en fait plus complexe, mais sur le principe c'est ça elle sort un tableau si l'usager a une session ou un cookie.

Ensuite dans un fonction x qui peut être elle même appelée depuis une autre fonction je vais avoir besoin du tableau visitor, donc je fais "global $visitor".



function &singleton($class){
	static $instances = array();
	if(!isset($instances[$class])) $instances[$class] = new $class;
	return $instances[$class];	
}

class Visitor {

  var $visitor = array();
  
  function &get_user(){
    return singleton('Visitor');
	}
  
  function verify_user(){
    $this->visitor['id'] = '1';
    $this->visitor['name'] = 'toto';
  }
}

function exemple2(){
  $set_session =& Visitor::get_user();
  echo $set_session -> visitor['name'];
}


Dans cet autre cas c'est la même chose, sauf que je ne fais pas appel a global mais à ma classe à chaque fois que j'ai besoin de mon tableau visitor.

Sur le principe c'est un peu plus propre, mais dans la pratique si mon application à peu de variables globales est ce vraiment utile?

Que faites vous quand vous avez besoin de variable globales?
Modifié par matmat (18 Jan 2008 - 22:00)
Salut,

J'ai toujours utilisé les variables globales pour l'identifiant des membres, par exemple. A la base, elles sont justement là s'éxécuter dans tous les contextes. Maintenant, je ne pourrais pas te dire si ton autre méthode est mieux ... disons que si c'est pour avoir un résultat similaire au variables globales, je n'en vois pas l'intérêt. Et s'il y en a un, je serais bien évidemment curieux de le connaître. Smiley smile
L'intêret réside quand tu as beaucoup d'includes, tu es sûr ainsi de ne pas avoir de probléme de confusion entre les variables. Un autre intêret et que si tu veux partager ton application ou une partie de celle-ci, si elle est plein de variables globales elle risque de ne pas fonccioner dans d'autre contexte pour cause de variables similaires. Ce qui peut arriver également quand tu utilises des fichiers de ta propre bibliothéque pour lesquels tu avais oublié que tu utilisais tel ou tel variables globales. Avec ces méthodes tu peux ainsi produire une application plus "portable".

L'intérêt théorique est réel, c'est plutôt l'interêt pratique que je met, comme toi un peu, en doute. Si quelqu'un a une expérience de site en production avec ces méthodes...
Je me permet un petit up du sujet, je pense que c'est interressant,

Pour info sur les exemples plus haut c'est un peu confus parceque c'est en php4, en php5 c'est beaucoup plus simple, parceque php ce met aussi a la mode POO.

Donc, si vous avez des avis sur le sujet, cela m'aiderais beaucoup à faire mes choix. En fait c'est important parceque ce sont des choix "définitifs". Si au début d'un projet on décide d'utiliser tel variable comme variable globale, aprés au cours du projet c'est difficile de revenir en arriére.
Modifié par matmat (16 Jan 2008 - 21:26)
j'ai eu une fois a travailler dans une boite où il faisait tout en php MVC et dans ce schéma j'avais plein d'instances a créer et souvent de toujours la même classe. et on utilisait donc le singleton.

bon le constat c'est que le site que j'ai fait avec eux était assez lent et que je ne voyais pas trop d'où ca venait.

c'est peut-être tous simplement l'hebergeur de l'epoque qui pedalait dans le vide.

mais ça m'a laissé une mauvaise impression du modele MVC même si le patron de l'epoque me disait mais non avec les singleton toutes les instanciations dans ton code on s'en moque.

ca venait peut-etra aussi de controleurs trop dense que j'avais pas assez divisé en fichier disjoint. je sais pas aujourd'hui encore ça m'intrigue et je sais pas trop

c'est vraiment pas suffisant pour avoir un vrai avis.

simplement je suis pas fan de la poo.
Modifié par CPascal (16 Jan 2008 - 22:17)
merci pour ta réponse,

C'est en effet une question que je me pose aussi, est ce que cela est plus lent qu'une varibale globale, surement un peu mais à quel point?

La POO je trouve ça plutôt sympa surtout pour une question de clarté du code, par exemple :

$leftmenu = new Menu();
$leftmenu -> fields = 'title,color,logo';
$leftmenu -> logo(80,80);
$leftmenu -> order("date");
$leftmenu -> where("status='hmenu'");


c'est quand même plus lisible que :

$fields = array('title','color','logo');
$leftmenu = get_menu("status='hmenu'",$field,'date','logo');


ça évite d'avoir à passer 15 variables en paramétres et de ne plus savoir lequel correspond a quoi et de devoir mettre false au cas ou il n'y en a pas.

Par contre je trouve aussi que vouloir faire tout en POO c'est inutile parcequ'il y a beaucoup de fonction qui sont trés bien en temps que fonction genre
$article['date'] =  set_date_format($date,'Y-m-d H:i:s','french')

c'est rapide à écrire et c'est clair donc faire une classe ça servirait pas à grand chose.