IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Mise en cummun de variables entre les objets


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Points : 73
    Points
    73
    Par défaut [POO] Mise en cummun de variables entre les objets
    Bonjour,

    Je recrée un site en php5, et j'ai des informations communes à l'ensemble de la page. J'ai entre autre mon objet mysqli pour ma connection mysql, une variable m'indiquant si l'utilisateur est identifié (membre) ou si c'est un admin, et la langue choisie.

    Pour utiliser ces variables dans l'ensemble de mes objets (pour ne pas refaire tous les tests sur mes variables de session à chaque instanciation de classe), j'ai étudié ces solutions :
    - soit je passe les valeurs de mes variables en paramètre de mon constructeur. Je pense que ça marcherait, mais je n'apprécie pas trop : si un jour j'ai une variable de plus à passer, je vais devoir remodifier mes constructeurs, et passer un paramètre de plus à chaque appel de constructeur...

    - soit je passe mes variables en globales. Mais justement, j'aimerais éviter! Et puis sérializer mes objets, ça ralonge le traitement.

    - soit je crée des singletons. C'est la solution que j'essaie de voir plus en détails. Je connais la théorie des singletons, mais serait-il possible de créer un singleton contenant l'ensemble des valeurs qui m'intéresse, et de faire sur mes classes un extend de ce singleton?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Classe_commune
    {
    	protected static $langue;
    	protected static $db;
    	(...)
     
    	public function set_langue (...)
    	{
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Livredor extends Classe_commune
    {
    	(...)
     
    	public function __construct ()
    	{
    		if (!isset($self::db)
    		{
    			$self::db = new mysqli();
    		}
    	}
     
    	public function liste ()
    	{
    		$self::db->query(...);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class News extends Classe_commune
    {
    	(...)
     
    	public function __construct ()
    	{
    		if (!isset($self::db)
    		{
    			$self::db = new mysqli();
    		}
    	}
     
    	public function liste ()
    	{
    		$self::db->query(...);
    	}
    }
    Cette solution semble-t'elle cohérente? Avez-vous d'autres idées?

    Merci d'avance

  2. #2
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Une solution fréquente en php, quand on ne veut pas trop polluer l'espace avec des variables globales, ni déclarer 50 mille classes singleton, c'est d'utiliser un Service Locator, aussi appelé Registry. De manière minimale, c'est juste une classe qui encapsule un array et dont l'accès est fourni à l'aide de méthodes statiques. L'utilisation ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Registry::set('db', new mysqli);
    Registry::set('user', new user);
    // ....
    $db = Registry::get('db');
    On peut dons accéder de n'importe où aux objets placés dans le registry (sachant que php5 manipule des références d'objets et non des copies).

    Juste au cas où:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $self::db // pas bon
    self::$db // ok bob

  3. #3
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Points : 73
    Points
    73
    Par défaut
    Merci de ta réponse. Pour ce qui est de mon erreur de syntaxe, tu as 100% raison :p J'avais écrit le code d'exemple dans le bloc-note sans le tester, et j'ai pas fait attention. Comme je débute en POO, je fais encore des petites erreurs de ce genre.

    J'ai commencé à chercher de la doc sur le Registry, et pour le moment je n'ai trouvé que ceci : http://www.patternsforphp.com/wiki/Registry. Mais visiblement ce n'est pas ce dont tu me parles... Là c'est un design pattern.

    J'ai un peu de mal à voir l'utilité du Registry : quel est l'avantage de l'utiliser plutot que de créer une classe commune contenant des variables statiques? Est-ce le fait que ces variables sont utilisables n'importe où, sans avoir besoin de faire un extend pour chaque classe? Quelle est la différence avec une variable globale? Y a-t'il un avantage en termes d'utilisation, de performance? Est-ce juste plus propre?

    [Edit] Ah si, c'était bien ça. Je pensais que c'était une fonction implémentée en PHP, mais non. OK donc ça se rapproche de ce dont j'ai fait, mis à part que les méthodes sont statiques, pour qu'elles soient utilisables de partout. L'idée est bonne Merci bien pour tes conseils, je vais les mettre en application!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 14h56
  2. Variables entre les symboles
    Par Nutaak dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 31/01/2009, 16h19
  3. Partage de variable entre les sessions
    Par zinia dans le forum Servlets/JSP
    Réponses: 20
    Dernier message: 21/07/2008, 18h20
  4. Réponses: 3
    Dernier message: 07/03/2007, 12h10
  5. Partage d'une variable entre les processus fils
    Par Mehdi Feki dans le forum Linux
    Réponses: 7
    Dernier message: 09/01/2005, 14h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo