Surcharge de méthodes

cs_mole Messages postés 9 Date d'inscription vendredi 1 juillet 2005 Statut Membre Dernière intervention 5 mars 2011 - 6 mars 2006 à 15:03
DijxDreaM Messages postés 4 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 14 juillet 2008 - 9 juil. 2008 à 10:24
Bonjour,

Quelqu'un aurait un exemple de surcharge de méthodes ?
J'aimerais pouvoir surcharger les constructeurs de mes classes mais les exemples que je trouve sur le net ne m'aide pas beaucoup.

Merci.
A voir également:

17 réponses

cs_mole Messages postés 9 Date d'inscription vendredi 1 juillet 2005 Statut Membre Dernière intervention 5 mars 2011
7 mars 2006 à 08:44
Merci pour ton script.

Dans le même genre aurais tu également un exemple à me donner avec redéfinition de méthodes avec un nombre d'arguments différent. J'aimerai pouvoir appeler un contrcuteur de classe différent en fonction du nombre d'arguments passés.

Voici l'idée :

classe MaClasse{

function MaClasse(){ // Contructeur 1
}

function MaClasse(arg1){ // Contructeur 2
}

function MaClasse(arg1,arg2){ // Contructeur 3
}
}

maObjet = New MaClasse(); // Appel contructeur 1
maObjet2=New MaClasse(1,2); // Appel contructeur 3

On peut faire ça en PHP ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 mars 2006 à 10:18
Hello,

class MaClasse {

public function __construct () {
$aArgs = func_get_args ();
$cpt = count ($aArgs);
if ($cpt === 0) {
$this -> construct0 ();
}
if ($cpt === 1) {
$this -> construct1 ($aArgs);
}
}
}

etc...
0
cs_mole Messages postés 9 Date d'inscription vendredi 1 juillet 2005 Statut Membre Dernière intervention 5 mars 2011
7 mars 2006 à 10:25
Tout simplement ! Je ne pensais pas qu'il était possible de déclarer un constructeur "générique" et de l'appeler avec un nombre indéfini d'arguments.
Autre point : j'ai remarqué que tu utilisais le nom __construct() pour le constructeur de la classe. C'est un nom de méthode réservé ?
J'avais l'habitude (avec Java) de nommer le constructeur avec le même nom que la classe. Ca à l'air de fonctionner aussi en PHP mais faut-il mieux utiliser __construct() ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 mars 2006 à 10:30
Bah, tu as de toutes façons ton constructeur, et en fonction du nombre d'arguments qu'on lui passe, tu vas appeler la méthode voulue qui elle, va réellement construire ton objet, c'est tout.

pour le public function __construct () c'est la syntaxe PHP5.
En php 5, le constructeur est __construct (et doit être public).
Le destructeur est __destruct ().
Il y a pas mal de spécificités à PHP5, tu peux mater la doc à ce propos.
http://fr2.php.net/manual/fr/language.oop5.php

Visiblement tu utilises PHP4, donc n'en tiens pas compte. Le principe reste le même de toutes façons.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 mars 2006 à 10:33
Attention, je ne surcharge pas le contsructeur, j'appelle des méthodes avec des noms différents, hein...


Selon ce que tu veucx faire, la méthode de FhX est parfaite : un objet étendu, là tu peux surcharger le constructeur de la classe parente.


Mais au sein d'une même classe, tu ne peux pas surcharger le constructeur (pas que je sache), en php.
0
cs_mole Messages postés 9 Date d'inscription vendredi 1 juillet 2005 Statut Membre Dernière intervention 5 mars 2011
7 mars 2006 à 10:39
OK merci pour vos réponses.
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
7 mars 2006 à 11:04
Ah non ! De plus, si tu utilises 2 constructeurs ( à savoir __construct(), et le nom de ta classe), il va y avoir gros bug !

"En php 5, le constructeur est __construct (et doit être public)." <== Peut être privé via Singleton au passage ;)

Maintenant, si tu veux avoir un nombre d'arguments variables en fonction du constructeur, la méthode de Malalam est l'unique possibilité. En effet, en php, tu ne peux pas faire :

class x { public function __construct($var) { // } }
class y extends x { public function __construct($var, $var2) { // } }

C'est impossible, tu va rencontrer une erreur fatale. C'est marqué dans la doc ca de toute facon, et ca risque d'être corrigé un peu plus tard (à moins que ca soit déja fait, faudrait que je regarde).

L'unique facon est d'utiliser func_get_arg() et compagnie !
Ou alors, tu passes un unique argument qui sera un tableau... la t'auras pas de problème :)

De toute facon, la surcharge de méthode ne marche que pour un extends de classe. Voila voila :)
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
7 mars 2006 à 11:07
"classe MaClasse{

function MaClasse(){ // Contructeur 1
}

function MaClasse(arg1){ // Contructeur 2
}

function MaClasse(arg1,arg2){ // Contructeur 3
}
}"

Nonon :)
class MaClasse1 {
function MaClasse1() { // Constructeur }
}
class MaClasse2 extends MaClasse1 { // Je récupère MaClasse1 dans MaClasse2
function MaClasse2() { // Constructeur indépendant }
}
class MaClasse3 extends MaClasse2 { // Je récupère MaClasse2 et MaClasse1 dans MaClasse3
function MaClasse3() { // Constructeur indépendant }
}

$x = MaClasse1;
$y = MaClasse2;
$z = MaClasse3;

// Appelera un constructeur différent :)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 mars 2006 à 11:16
"En php 5, le constructeur est __construct (et doit être public)." <== Peut être privé via Singleton au passage ;)

=> certes :-)
Elle peut aussi être privée ou protégée dans le cadre de classes abstraites, en fait. C'était juste pour généraliser lol.

Pour la surcharge du constructeur, je ne pense pas que ce soit déjà corrigé. Faudrait que j'essaye...mais bon. Ceci dit, c'est vrai que c'est dommage, c'est une jolie possibilité.

J'attends plutôt l'héritage multiple, perso, mais bon ;-)
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
7 mars 2006 à 11:35
Mouais bah l'héritage multiple... tu peux faire une croix dessus pour le moment :)
Parait que y'a beaucoup de gens qui ont peur de ca... alors pour le moment, c'est niet !

Reste les interfaces :p
0
cs_mole Messages postés 9 Date d'inscription vendredi 1 juillet 2005 Statut Membre Dernière intervention 5 mars 2011
7 mars 2006 à 14:33
Avec votre aide, j'ai resussi à faire ce que je voulais (en attendant la surcharge d'opérateur). Voici le résultat pour ceux auraient les mêmes interrogation que moi.
Le but était de créer un utilisateur de plusieurs façons (l'utilisateur sera alors stocké dans une base de données). Ensuite, le programme appelera les utilisateurs stockés dans la base à partir de la classe Utilisateur qui contiendra toutes les méthodes (dont la fonction chargée de récupérer l'utilisateur depuis la base).
Utilisateur est en fait une Interface des objets enfants mais je crois savoir que cette notion n'existe pas dans PHP. Il y avait sans plus élégant mais bon pour un novice comme moi...

<html>

<?php


class Utilisateur{
var $login,$password,$verrou,$compteur,$roles;
var $praticien,$nom,$prenom,$actif;
}


class UtilisateurSimple extends Utilisateur{
function UtilisateurSimple($login,$password,$roles){
// parent::Utilisateur();
$this->login = $login;
$this->password = $password;
$this->roles = $roles;
}
}


class UtilisateurAttache extends UtilisateurSimple{
function UtilisateurAttache($login,$password,$roles,$praticien,$actif){
parent::UtilisateurSimple($login,$password,$roles);
$this->actif = $actif;
$this->praticien = $praticien;
}
}


class UtilisateurPraticien extends UtilisateurSimple{
function UtilisateurPraticien($login,$password,$roles,$nom,$prenom,$actif){
parent::UtilisateurSimple($login,$password,$roles);
$this->nom = $nom;
$this->prenom = $prenom;
$this->actif = $actif;
}
}


$utilisateurSimple = new UtilisateurSimple('prenom.nom','password',8);
$utilisateurAttache = new UtilisateurAttache('prenom.nom','password',8,1,1);
$utilisateurPraticien = new UtilisateurPraticien('prenom.nom','password',8,'NOM','Prénom',1);


echo $utilisateurSimple->login." ".$utilisateurSimple->password." ".$utilisateurSimple->roles."
";
echo $utilisateurAttache->login." ".$utilisateurAttache->password." ".$utilisateurAttache->roles." ".$utilisateurAttache->praticien."
";
echo $utilisateurPraticien->login." ".$utilisateurPraticien->password." ".$utilisateurPraticien->roles." ".$utilisateurPraticien->nom." ".$utilisateurPraticien->prenom." ".$utilisateurPraticien->actif."
";
?>

</html>

Merci à tous.
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
7 mars 2006 à 18:17
Regarde le tuto que j'ai fait sur la gestion des droits des membres en version orientée objet. Ca pourrait venir t'aider.

Passe à PHP5 aussi quand t'auras le temps. La version 4 ne sert pas à grand chose niveau objet.

De plus, la notion d'interface existe depuis PHP5, tout comme la notion d'abstraction et le reste...
0
cs_craso Messages postés 55 Date d'inscription mardi 6 juin 2006 Statut Membre Dernière intervention 20 janvier 2009
3 oct. 2006 à 23:11
Bonjour, j'ai bien tout suivi et j'ai quand même une question, il faut dire que le probl^me est un peu différent, je vous montre le code et j'explique ensuite:

abstract class soldat
{
    public $nom;
    public $prenom;
    public $pv=30;
   
    function __construct($prenom, $nom)
    {
        echo $this->prenom = $prenom;
        echo $this->nom = $nom;
    }
..
}

class francais extends soldat
{
   
    static private $pays="FRANCE";
   
    function __construct()
    {
        abstract::__construct;//je veux interpréter le code du construct de la classe abstraite
        $this->pv+=4;
    }
..
}

Donc mon but est d'arriver à executer le code du construct de la classe abstraite...si vous voyez de quoi je parle.
Je sens que je vais beaucoup alimenter ce forum ,parce que je débute en poo ,moi.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 oct. 2006 à 08:06
Hello,

parent::__construct($nom, $prenom);

faut pas oublier les variables que tu demandes, non plus.
0
DijxDreaM Messages postés 4 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 14 juillet 2008
9 juil. 2008 à 10:24
ou sinon tu récupère tout simplement les classes que j'ai développé sur le modèle de celles de framework de sun ici: http://apps.dijxdream.com/php/DX_FRAMEWORK/

A l'intérieur de l'archive, tu as un fichier Over.php qui s'occupe de l'implémentation de mon outil de surcharge de méthodes.
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
6 mars 2006 à 16:13
class x {

public $array = array();

public function __construct($arg1, $arg2) {

$this->array['arg1'] = $arg1;
$this->array['arg2'] = $arg2;

}

}

class y extends x {

public function __construct($arg1, $arg2) { // Je surcharge la méthode du constructeur, donc de ce fait je vais faire : -> Soit autre chose ; -> Soit je vais rajouter des fonctionnalités
parent::__construct($arg1, $arg2); // Ici j'appèle le constructeur du parent. J'utilise donc les fonctionnalités de base.
$this->array['arg1-arg2'] = $this->array['arg1'] + $this->array['arg2'];
}

}

$y = new y(4,8);
echo $this->array['arg1-arg2']; // Affichera 12;

Voila comment ca marche !
-1
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 mars 2006 à 10:20
à Vrai dire, y a même func_num_args () pour compter le nombre d'arguments, func_get_args () pour les récupérer dans un tableau, et func_get_arg (numero_argument) pour accéder à un argument précis en fonction de son ordre d'entrée dans la méthode.
-1
Rejoignez-nous