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 :

Problème d'injection de dépendance ?


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Problème d'injection de dépendance ?
    Bonjour,

    Je me pose une question sur les injections de dépendance.
    Admettons que j'ai une méthode request appelé par un webservice, je ne peux pas mettre la dependency injection de cette façon :
    request($myDependance, $otherArgs)

    Je me dis donc que je vais utiliser l'injection de dépendance via setter, mais je n'ai pas toujours besoin d'injecter la dépendance, elle est par défaut à une valeur, donc je fais un truc tordu et crade de cette façon :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    <?php
     
    class classSoap
    {   
     
        public function __construct() {}
     
        public function request($bouh)
        {
     
            $a = $this->getSay();
            $a->say();
     
        }
     
        public function setSay(say $say)
        {
     
            $this->_say = $say;
     
        }
     
        public function getSay()
        {
     
            if (isset($this->_say) === false) {
                return new sayThat();
            } else {
                return $this->_say;
            }
     
        }
     
     
    }
     
    interface say {
        public function say();
    }
     
    class sayThat implements say {
        public function say()
        {
            echo 'Hello';
        }
    }
     
     
    $soap = new classSoap();
    //$soap->setSay(new sayThat());
    $soap->request('bouh');
     
    ?>
    On doit forcément pouvoir faire mieux ou plus propre non ?

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bon à part du sucre syntaxique, je vois pas trop comment améliorer ce code. Il est clair que si l'instance de la classe classSoap doit voyager afin d'avoir ses paramètres définis, il est impossible de faire autrement qu'avec un set/get.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
     
    class classSoap {   
     
    	private $_say;
     
    	function request($bouh) {
    		$this->getSay()->say($bouh);
    	}
     
    	function setSay(say $say) {
    		$this->_say = $say;
    	}
     
    	function getSay() {
    		return (isset($this->_say)) ? $this->_say : new sayThat();
    	} 
    }
     
     
    interface say {
    	function say();
    }
     
     
    class sayThat implements say {
    	function say() {
    		echo 'Hello';
    	}
    }
     
     
    $soap = new classSoap();
    //$soap->setSay(new sayThat());
    $soap->request('bouh');
     
    ?>

  3. #3
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    A vue de nez tu pourrais aussi faire ceci (après ça dépend de ton code, là avec juste ton exemple ça irait) :
    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
    18
    19
    20
    21
    22
    23
    abstract class soapInstance {
    	private static $_instance;
     
    	public static function &getInstance() {
    		if(is_null(self::$_instance)) {
    			self::$_instance	= new sayThat;
    		}
     
    		return self::$_instance);
    	}
    }
     
     
    class classSoap {   
         public function __construct() {}
     
        public function request($bouh)
        {
            $a = soapInstance::getInstance();
            $a->say();
     
        } 
    }
    Tu pourrais également penser à utiliser le pattern Strategy.
    Zend PHP Certified Engineer, Certifié Symfony2
    blog : blog.lepine.pro
    Secrétaire de l'AFUP (Association des Utilisateurs de PHP)

  4. #4
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Juste un ptit commentaire,

    @Hallek, les objets sont tous passés par référence (à moins de retourner une évaluation ou de cloner l'objet bien sûr), l'opérateur de retour par référence dans ta fonction getInstance est inutile, voire déprécié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static function getInstance() {
        if(self::$_instance === NULL) {
            self::$_instance = new sayThat;
        }
        return self::$_instance;
    }

Discussions similaires

  1. [Framework] Problème injection de dépendance Spring + JSF
    Par wahhh dans le forum Spring
    Réponses: 1
    Dernier message: 02/04/2015, 23h56
  2. Problème avec injection de dépendances
    Par PascalCmoa dans le forum Services Web
    Réponses: 4
    Dernier message: 31/10/2013, 08h56
  3. [Framework] BeanCreationException ? problème d'injection de dépendances
    Par Fikou-Sama dans le forum Spring
    Réponses: 2
    Dernier message: 21/06/2010, 11h12
  4. [Integration] [EasyMock] Injection de dépendance à l'éxécution
    Par frangin2003 dans le forum Spring
    Réponses: 2
    Dernier message: 06/03/2007, 11h06
  5. Spring + TagSupport et injection de dépendance
    Par worldchampion57 dans le forum Spring Web
    Réponses: 2
    Dernier message: 26/02/2007, 09h01

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