Surcharger un constructeur au sein d'une même classe

Résolu
michel_roger Messages postés 60 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 18 août 2006 - 30 juin 2006 à 11:55
michel_roger Messages postés 60 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 18 août 2006 - 3 juil. 2006 à 08:58
Bonjour,

Je cherche actuellement à créerqqs classes en PHP5 et désire savoir s'il est possible de surcharger un constructeur en PHP5.
En effet, j'ai essayé de donner le même nom à tous les constructeurs (__construct(paramètres) et __construct(param1, paramN1) ou maSousClasse(paramètres) et maSousClasse(param1, paramN1) et là :
Erreur de script : cannot redeclare method maSousClasse::maSousClasse.
Je croyais pourtant que la surcharge était prise en compte en PHP5, cependant on dirait qu'elle est prise en compte d'une classe mère à une classe fille mais pas au sein d'une même classe...
Voici un exemple de ce que je voudrais faire :

<?php
abstractclass maClasse {
    private $param1;
    private $param2;
    private $param3;
    private $param4;
    ...
    private $paramN;
 
    // Constructeur de base nécessitant beaucoup de paramètres (peu utilisé) 
    public function__construct($param1, $param2, $param3, $param4, ..., $paramN) {
        $this->param1 = $param1;
        $this->param2 = $param2;
        $this->param3 = $param3;
        $this->param4 = $param4;
        ...
        $this->paramN = $paramN;
    }
}



class maSousClasse extends maClasse {
    private $paramN1;
 
    // Constructeur de base nécessitant beaucoup de paramètres (peu utilisé également)
    public function__construct($param1, $param2, $param3, $param4, ..., $paramN, $paramN1) {
        // On appelle le constructeur parent avec tous les paramètres
        parent::__construct($param1, $param2, $param3, $param4, ..., $paramN);
        $this->paramN1 = $paramN1;
    }
    // Constructeur surchargé (utilisé souvent car moins de paramètres)
    public function maSousClasse($param1, $paramN1) {
        // On appelle le constructeur parent avec la majorité des paramètres à null
        parent::__construct($param1, null, null, null, ..., null);
        $this->paramN1 = $paramN1;
    }
}
// Lorsque j'appelle mon constructeur avec tous les paramètres, tout se passe bien :
$classe = new maSousClasse ("test", 2, 3, 4, ..., $N, $N1);
// Lorsque j'appelle mon constructeur "simplifié",
// Erreur de script, les paramètres sont manquants :
$classe = new maSousClasse(("test", $N1);
?>
Merci d'avance pour votre aide
Bonne journée
Cordialement

4 réponses

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 juin 2006 à 14:00
Exact, on ne peut surcharger une méthode au sein d'une même classe.

Pour faire ce que tu veux faire, utilises func_num_args();
Ex :

class x extends y {

public function __construct() {
$num_args = func_num_args();
if ( $num_args === 2 ) { // 2 arguments passé en paramètre
} else { // Plein plein d'arguments :)
}
parent::__construct();
}

}

Seul et unique facon pour le moment.
3
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
30 juin 2006 à 11:59
Salut!
Je vais peut être dire une connerie, mais en utilisant
func_num_args ( http://ch2.php.net/manual/fr/function.func-num-args.php )
func_get_arg ( http://ch2.php.net/manual/fr/function.func-get-arg.php )
func_get_args ( http://ch2.php.net/manual/fr/function.func-get-args.php )

Tu arrives pas à triche? :)

@++

R@f

www.allpotes.ch: Photos, humour, vidéos, gags, ...
"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 juin 2006 à 12:07
Salut,

la surcharge en php5 ne correspond pas à celle du cpp
en cpp, on peut surcharger les opérateurs :

objet a=new objet();

objet b=new objet();

objet c=a+b;

on peut aussi surcharger la copie d'objets en cpp...

en php, on surcharge isset, unset, et les accès aux méthodes et aux propriétées, à ma conaissance, rien de plus

In a dream, I saw me, drop dead... U was there, U cried... It was just a dream, if I die, U won't cry, maybe, U'll be happy

Mon site (articles sur la programmation et programmes)
0
michel_roger Messages postés 60 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 18 août 2006
3 juil. 2006 à 08:58
Ok merci beaucoup je vais voir avec ça.

Bonne journée et bonne semaine
0
Rejoignez-nous