Surcharge de méthodes

Signaler
Messages postés
9
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
5 mars 2011
-
Messages postés
4
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
14 juillet 2008
-
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.

17 réponses

Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
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 !
Messages postés
9
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
5 mars 2011

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 ?
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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...
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
à 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.
Messages postés
9
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
5 mars 2011

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() ?
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.
Messages postés
9
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
5 mars 2011

OK merci pour vos réponses.
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
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 :)
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
"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 :)
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
"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 ;-)
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
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
Messages postés
9
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
5 mars 2011

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.
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
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...
Messages postés
55
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
20 janvier 2009

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.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

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

faut pas oublier les variables que tu demandes, non plus.
Messages postés
4
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
14 juillet 2008

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.