Surcharge constructeur et avis pour mes classes

Résolu
cs_vega11 Messages postés 39 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 15 juillet 2010 - 10 mars 2007 à 19:49
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre 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 !

4 réponses

cs_vega11 Messages postés 39 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 15 juillet 2010 1
11 mars 2007 à 09:39
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
1
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
10 mars 2007 à 20:30
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+
0
DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 1
10 mars 2007 à 21:00
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 ...
}
}
}
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
11 mars 2007 à 21:50
Tout comme la surcharge de n'importe quoi :)

Tu ne peux faire que de l'héritage de méthode pour le moment !
0
Rejoignez-nous