cs_mole
Messages postés9Date d'inscriptionvendredi 1 juillet 2005StatutMembreDernière intervention 5 mars 2011
-
6 mars 2006 à 15:03
DijxDreaM
Messages postés4Date d'inscriptiondimanche 25 novembre 2007StatutMembreDernière intervention14 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.
cs_mole
Messages postés9Date d'inscriptionvendredi 1 juillet 2005StatutMembreDerniè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
}
}
cs_mole
Messages postés9Date d'inscriptionvendredi 1 juillet 2005StatutMembreDerniè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() ?
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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 :)
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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 }
}
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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 ;-)
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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 !
cs_mole
Messages postés9Date d'inscriptionvendredi 1 juillet 2005StatutMembreDerniè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);
cs_craso
Messages postés55Date d'inscriptionmardi 6 juin 2006StatutMembreDernière intervention20 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()
{
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.
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;
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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.