Surcharge constructeur et avis pour mes classes [Résolu]

cs_vega11
Messages postés
39
Date d'inscription
lundi 24 avril 2006
Dernière intervention
15 juillet 2010
- 10 mars 2007 à 19:49 - Dernière réponse : FhX
Messages postés
2368
Date d'inscription
mercredi 13 octobre 2004
Dernière intervention
18 avril 2015
- 11 mars 2007 à 21:50
Bonjour à tous, je refais actuellement mon site en php objet 5 après un super stage en JAVA, je trouve le php réellement sympa en objet ^^

Une chose me chagrine je ne trouve pas comment faire une surcharge de constructeur, je m'explique.

Pour ma classe Message, j'ai besoin de 2 constructeurs.

un qui s'initialise avec l'id quand je recup tous les id des messages d'une personne et que je boucle pour créer chaque message et les charger.

un qui fonctionne sans parametres lorsque je fais appel à une methode d'envoi de message et donc l'id sera mis lors de l'INSERT dans la base.

function __construct($id){
  $this->id=$id;
  }

j'ai essayé de mettre le deuxieme comme ceci :

function __construct(){
 

  }

mais ca ne marche pas et si je ne met pas de deuxieme constructeur je ne peux de tte facon pas instancier la classe sans le parametre id.

j'ai aussi beaucoup avancé au niveau des classes avec un pseudo singleton sur ma classe Database car toutes les requetes passe par elle et je réutilise donc mon objet instancié de Database assez souvent dans les autres classes.

2 exemples :

1) dans la classe User (méthode envoi de mess)

function sendMessageTo($receiver,$message){
  $message->setSender($this->getLogin());
  $message->setReceiver($receiver);
  $db=Database::getCurrent(); //methode statique qui renvoi la database courante ^^
  $db->sendMessage($message);
  }

qui se traduit dans la classe Database par

function sendMessage($message){
  $this->queryUpdate($this->sendMessageQueryString($message));
  }

2) dans la classe user (méthode qui charge les infos dans l'objet)

function load(){
  
   $db=Database::getCurrent();
   $db->loadUser($this);
  
   }

qui se traduit dans Database par

function loadUser($user){
 
 $login=$user->getLogin();
 $infos=$this->query($this->loadUserQueryString($login));
 
 $user->setName($infos->CliPrenom);
 $user->setAvatar($infos->avatar);
 $user->setMail($infos->mailclient);
 $user->setCity($infos->ville);
 $user->setSex($infos->sexe);
 $user->setDescription($infos->description);
 $user->setGoodside($infos->qualite);
 $user->setBadside($infos->defaut);
 $user->setNet($infos->net);
 $user->setSport($infos->sport);
 $user->setMusic($infos->music);
 $user->setBirth($infos->daten);
 $user->setStatus($infos->celib);
 $user->setInscriptionDate($infos->dateinsc);
 
 }

Je programme en objet depuis seulement 2 mois si je compte le stage donc toutes les précisions sont le bienvenu.
J'aimerais donc une solution pour la surcharge et votre avis sur mon debut d'architecture objet.

Merci d'avance !
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_vega11
Messages postés
39
Date d'inscription
lundi 24 avril 2006
Dernière intervention
15 juillet 2010
- 11 mars 2007 à 09:39
1
Merci
Ok ! merci beaucoup je pensais que c'était possible la surcharge de constructeur en php5 je vais donc utiliser une de ces 2 méthodes merci beaucoup ^^

Je vais pouvoir paufiner tout ca :D

Merci cs_vega11 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_vega11
J_G
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Dernière intervention
28 août 2007
- 10 mars 2007 à 20:30
0
Merci
Salut,

Pour le premier point, tu peux définir une valeur par défaut pour tes paramètres:

function ( $param = 'valeur par défaut' ) {
    echo $param;
}

ça marche aussi pour le constructeur :
public function __construct( $id = false ) {
    if ( $id === false ) // action sans paramètres
    else // action avec l'id
}

Pour ton deuxième point, cherche la doc sur les fonctions magiques __set() et __get()... Ca surcharge la façon de modifier, récupérer un paramètre de classe...

http://www.php.net/manual/fr/language.oop5.overloading.php

Tu peux alors t'amuser à faire comme le premier exemple, utiliser un tableau pour stocker les variables... du coup, tu pourrais toutes les charger d'un coup...

$object->x = $array_info;

Sinon, un foreach sur un objet te permet de faire
foreach ($object as $property=>$value) $object->$property = $new_value;

Par exemple...
Enfin... je te laisse jouer!
A+

A+
Commenter la réponse de J_G
DiGhan
Messages postés
240
Date d'inscription
samedi 21 février 2004
Dernière intervention
3 juin 2010
- 10 mars 2007 à 21:00
0
Merci
Salut,

php n'offre pas la possibilité d'implémenter plusieurs constructeurs avec des signatures différentes. La seule solution est d'utiliser les fonctions func_get_num_args() pour connaitre le nombre de paramètres et func_get_args() ou func_get_arg() pour récupérer les valeurs des paramètres.

ex:

class CConstruct
{
public __construct()
{
$nArgs = func_get_num_args();
switch($nArgs)
{
case 0:
case 1:
default:
ect ect ...
}
}
}
Commenter la réponse de DiGhan
FhX
Messages postés
2368
Date d'inscription
mercredi 13 octobre 2004
Dernière intervention
18 avril 2015
- 11 mars 2007 à 21:50
0
Merci
Tout comme la surcharge de n'importe quoi :)

Tu ne peux faire que de l'héritage de méthode pour le moment !
Commenter la réponse de FhX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.