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 :

Traduction de new static; pour V5.2 ? [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Traduction de new static; pour V5.2 ?
    Bien le bonjour,

    Voici, j'ai un souci pour transcrire un code compatible PHP 5.3.1 pour une version 5.2.6.

    Le contexte est une classe de Singleton. J'ai deux classes qui en sont étendues DB_Manager et Catalogue afin, comme vous le savez, d'avoir une instance unique de ces classes dans tout le code.

    Lorsque j'ai codé avec Xampp, il n'y avait pas de troubles mais voilà lors de la migration vers le serveur de production, ce dernier était en version 5.2.6.

    Du coup, la syntaxe ?: n'était pas compris, pas de troubles je remplace mais dans la classe Singleton j'ai un new static; que je ne vois pas par quoi remplacer pour continuer à avoir un code correct.

    Voici le code de la méthode getInstance() du Singleton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected static $instance = null;
     
    final static public function getInstance()
        {
    	if(is_null(self::$instance)) {
    		self::$instance = new static;
    	}
    	return self::$instance;
        }
    J'ai tenté de remplacer par ce code-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    final static public function getInstance()
        {
    	if(is_null(self::$instance)) {
    		self::$instance = new Singleton();
    	}
    	return self::$instance;
        }
    Souci : Lorsque DB_Manager fait appel à getInstance(), alors l'objet n'est plus de type DB_Manager mais Singleton.
    Alors j'ai tenté autre chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    final static public function getInstance()
        {
    	if(is_null(self::$instance)) {
    		$class = get_class($this);
    		self::$instance = new $class();
    	}
    	return self::$instance;
        }
    Autre trouble, comme on ne passe pas par le constructeur des classes, je ne peux savoir quelle est la classe qui a appelé la méthode. Le $this de get_class est inconnu.

    Certes, je pourrais faire des singletons à l'intérieur des classes DB_Manager et Catalogue mais automatiser le concept des singletons serait un plus.

    Un check sur la ReflectionClass aurait-elle été la panacée ? Humm, j'ai un doute car toujours dans le contexte du static un $this->getName() n'est pas autorisé...

    Voyez-vous une issue négociable ?

    Au plaisir.

    Steve.
    Dernière modification par Invité ; 06/04/2010 à 16h38.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Après visionnage de quelques forums avec le même problème, je dois croire que la solution n'a pas l'air négociable dans une version inférieure à la version 5.3.

    Bon, j'ai une solution bricolée maison. Surtout ne vous envoyez pas en l'air mais pour ceux qui veulent quand même mettre en place ce concept, voici une solution qui n'est aucunement des plus à conseiller mais dans mon contexte allez disons que c'est passable...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    final static public function getInstance($class = 'Catalogue')
        {
    	if(is_null(self::$instance) || !(self::$instance instanceof $class)) {
    		self::$instance = new $class();
    	}
    	return self::$instance;
        }
    Comme la majorité des appels de cette méthode se fait par des classes hérités de Catalogue, je n'ai changé qu'une ligne dans mon code d'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $db = DB_Manager::getInstance('DB_Manager');
    Voilou, au plaisir.

    Steve.

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

Discussions similaires

  1. New DirectoryInfo() pour :\\serveur\?
    Par EE dans le forum ASP.NET
    Réponses: 16
    Dernier message: 16/06/2007, 13h09
  2. traduction /n en <\ br> pour textarea
    Par franfr57 dans le forum Langage
    Réponses: 3
    Dernier message: 30/04/2007, 12h50

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