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 :

Multiples signatures d'un constructeur [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 29
    Par défaut Multiples signatures d'un constructeur
    Bonjour,

    Je cherche à utiliser plusieurs constructeurs dans la même classe.

    J'ai réussi à l'aide de Switch et de la fonction func_get_arg(). Cependant, mon maître de stage n'approuve pas cette méthode (selon lui, le code ne serait pas en objet pur et le code ne serait pas réutilisable facilement) et me demande de le faire à l'aide de tableaux mais je ne vois pas du tout comment faire

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Il n'a pas totalement tor mais je pense que c'est toi qui a raison, si tu veux réélement avoir plusieurs prototypes disponibles pour un constructeur, il vaut mieux utiliser func_get_args.

    Enfin bref, ce que tu peux faire sinon (et qui est largement pratiqué dans certains frameworks comme Symphony pour les helpers de vue) c'est d'injecter un tableau, comme il le préconise, ça donne effectivement encore plus de souplesse.

    Voici concrêtement à quoi ça peut ressembler:
    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
    class Test extends stdClass {
     
      public function __construct (array $params = array()) {
        $defaults = array(
          'a' => 1,
          'b' => 2,
          'c' => 3
        );
     
        $params += $defaults;
     
        // Attention avec extract !
        extract($params);
     
        $this->a = $a;
        $this->b = $b;
        $this->c = $c;
      }
     
      public function __toString () {
         return "A {$this->a} B {$this->b} C {$this->c}";
      }
    }
     
    $t = new Test;
    echo $t;
     
    $t = new Test(array('a' => 4, 'c' => 8));
    echo $t;
    Tu peux d'ailleurs "mixer" les deux formes, voici ce que ça donnerai:
    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
    class Test extends stdClass {
     
    	public function __construct () {
    		$argc = func_num_args();
    		$argv = func_get_args();
     
    		if ($argc == 1 && is_array($argc)) {
    			$params = $argv[0];
    		}
    		else {
    			$params = array_combine(array('a','b','c'), $argv + array(null, null, null));
    		}
     
    		$defaults = array(
    			'a' => 1,
    			'b' => 2,
    			'c' => 3,
    		);
     
    		$params += $defaults;
     
    		$this->a = $params['a'];
    		$this->b = $params['b'];
    		$this->c = $params['c'];
    	}
     
    	public function __toString () {
    		return "A {$this->a} B {$this->b} C {$this->c}";
    	}
    }
     
    // Les formes suivantes sont équilvalentes
    $t1 = new Test(1,2,3);
    $t2 = new Test(array('a' => 1, 'b' => 2, 'c' => 3));
     
    echo $t1 . '<br />';
    echo $t2;
    A toi de voir

    L'inconvénient majeur de ces deux formes est qu'on ne bénéficie plus du type hinting, c'est donc au constructeur de valider les données qu'il reçoit au niveau de leur typage... pas très pratique. De plus, on peut passer des arguments arbitraires complétement inutiles ou pire.

  3. #3
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    C'est même moins bon je trouve car il faut aussi vérifier les index correspondant à des variables privé dont on ne doit pas modifier la valeur.

    Par contre pourriez-vous détailler le pourquoi pour func_get_args() ?

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Citation Envoyé par transgohan Voir le message
    Par contre pourriez-vous détailler le pourquoi pour func_get_args() ?
    Bah pour avoir plusieurs signatures pour le constructeur pardi

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 29
    Par défaut
    Bonjour et merci pour les réponse

    @Benjamin Delespierre
    Je ne comprend pas très bien désolé (je suis dans la prog objet depuis peu) mais par exemple que peut on mettre dans $param si on en a plusieurs ? Et je ne comprend pas le $params += $defaults;

    @transgohan
    Si ta question est "Pourquoi il ne veut pas de la fonction ?" C'est apparemment parce que le code doit être réutilisable.

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Citation Envoyé par lamb87 Voir le message
    @Benjamin Delespierre
    Je ne comprend pas très bien désolé (je suis dans la prog objet depuis peu) mais par exemple que peut on mettre dans $param si on en a plusieurs ? Et je ne comprend pas le $params += $defaults;
    Le tableau associatif $params remplace les paramètre qu'on passe sur la fonction habituellement. Les clés sont les noms des paramètres.

    L'utilisation de l'opérateur + sur des tableaux à pour conséquence d'ajouter au premier les valeurs du second dont les clés ne sont pas présentes dans le premier. Dans notre cas, ça va mettre les valeurs par défaut (définies dans $defaults) là dans $params si ces valeurs n'ont pas étés spécifiées.

    Un exemple vaut mieux qu'un long discours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $a = array(
    	'a' => 1,
    	'b' => 2,
    );
     
    $b = array(
    	'b' => 3,
    	'c' => 4,
    );
     
    var_dump( $a + $b );
    produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    array
      'a' => int 1
      'b' => int 2
      'c' => int 4
    On remarque que:
    • les valeurs de $b dont les clés ne se trouvent pas dans $a ont étés ajoutées
    • les valeurs de $a dont les clés sont présentes dans $b ne sont pas écrasées


    Pour la petite histoire, quand on veut explicitement écraser les valeurs existantes, on utilise array_merge.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 29
    Par défaut
    Mais pourquoi $b a 'int (2)' ?
    Désolé mais je souhaite vraiment comprendre à fond

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

Discussions similaires

  1. Multiple définition de mon constructeur perso
    Par antoine974 dans le forum C++/CLI
    Réponses: 3
    Dernier message: 16/11/2010, 22h18
  2. constructeur par recopie et heritage multiple C++
    Par ratounette dans le forum C++
    Réponses: 3
    Dernier message: 01/11/2007, 12h54
  3. interet des constructeurs multiples
    Par pseudobidon57 dans le forum Langage
    Réponses: 2
    Dernier message: 13/06/2007, 13h33
  4. problème de signature de mes constructeurs
    Par Kuroro dans le forum Langage
    Réponses: 11
    Dernier message: 16/05/2007, 16h47
  5. [MFC] multiple constructeur
    Par k_boy dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 11/04/2007, 14h49

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