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] Surcharge du constructeur d'une classe


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 92
    Points : 77
    Points
    77
    Par défaut [POO] Surcharge du constructeur d'une classe
    Bonjour,

    Je veux creer 2 constructeurs, qui prennent de differents nombres de parametres. Voici le code:
    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
     
    class msg{
        private $msg_title;
        private $msg_content;
     
        private function construct($title, $content){
            $this->msg_title = $title;
            $this->msg_content = $content;
        }
        private function construct2($content){
            $this->msg_content = $content;
        }
     
        public function __call($func, $arg){
            if($func == "msg" && count($arg) == 2)
                return $this->construct($arg[0], $arg[1]);
            else
                return $this->construct2($arg[0]);
        }
    }
    Le code il "fonctionne" sans erreur, mais en fait, l'objet qu'il me retourne est vide, il n'y a aucune valeur dedans.

    Donc j'aimerais savoir si quelqu'un peut me trouve l'erreur. Merci beaucoup

    ps: Sinon, est-ce qu'on peut mettre $title comme un argument optionnel?

  2. #2
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Bonjour,

    Je suppose que lorsque tu instancies un objet,
    PHP n'appelle pas la fonction magique __call,
    mais le constructeur par défaut,
    constructeur qui ne fait rien de plus que créer une instance
    puisque tu n'as pas de fonction __construct().
    Par contre peut-être pourrrais-tu utiliser les fonctions
    func_num_args() et func_get_args() dans __construct() :
    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
    class msg{
        private $msg_title;
        private $msg_content;
     
        private function construct1($content){
            $this->msg_content = $content;
        }
        private function construct2($title, $content){
            $this->msg_title = $title;
            $this->msg_content = $content;
        }
     
        public function __construct(){
    		$numargs = func_num_args();
    		$arg_list = func_get_args();
    		if ($numargs == 1) {
    			construct1($arg_list[0]);
    		}
    		if ($numargs == 2) {
    			construct2($arg_list[0],$arg_list[1]);
    		}
        }
    }
    Fred

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Pour passer un argument optionnel, il suffit de préciser sa valeur par défaut dans la signature de la fonction.

    Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function FuncWithOptArgs($argObligatoire, $argOptionnel = "valeurParDéfaut")
    {
         // ....
    }
     
    FuncWithOptArgs("hello","world");
    FuncWithOptArgs("hello");

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Citation Envoyé par anaranjado Voir le message
    ps: Sinon, est-ce qu'on peut mettre $title comme un argument optionnel?
    Dans la pratique oui, ilte suffit de mettre $title='', mais dans les faits c'est déconseillé car $title est le premier argument. Si il est optionnel mais pas le deuxième tu peux te retrouver avec des appels de ce gout
    new toto(null, "message");

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 92
    Points : 77
    Points
    77
    Par défaut
    Merci beaucoup !

    En fait, le code que j'ai mis ci-dessus est un exemple.
    C'est toujours l'histoire de ma classe User. Je voulais lui donner 2 constructeurs.

    Le premier qui prend toutes les proprietes(reception de data de $_POST) du User en parametre, et cree un objet User.

    Le deuxiem qui ne prend que le ID du User. et il lit les informations, dans la base de donnees, et construire un objet User.

    C'est 2 facons differentes pour construire un objet User. soit avec les donnees de $_POST. soit avec la base de donnees.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Salut,

    Si tu utilises directement les données de $_POST (attention à bien les vérifier quand même) tu peux aussi faire un constructeur unique avec un seul argument et tester ensuite le type d'argument passé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function __construct($arg) {
            if (is_array($arg)) {
                    //on a transmis un tableau avec toutes les valeurs donc on construit l'objet avec ces valeurs
            }
            else {
                    //si ce n'est pas un tableau c'est l'id qui a été transmis, donc on peut récupérer les valeurs dans la bdd et créer l'objet
            }
    }

Discussions similaires

  1. [POO] constructeur d'une class
    Par spirou dans le forum Langage
    Réponses: 13
    Dernier message: 05/07/2006, 16h11
  2. Réponses: 2
    Dernier message: 17/12/2005, 20h52
  3. Réponses: 2
    Dernier message: 04/12/2005, 21h10
  4. Réponses: 5
    Dernier message: 20/11/2005, 11h15
  5. Réponses: 3
    Dernier message: 06/11/2005, 18h02

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