De toutes façons, tu as besoin d'un constructeur, pour remplir les objets particulier ou professionnel automatiquement selon la construction via client.
Je m'explique: Le déclencheur est la carte CB, dont les données seront envoyées à la classe Client via la fonction statique qui authentifie le client selon les données de la carte CB et décide d'instancier un objet particulier ou professionnel. En suite, quand un objet est instancié, le constructeur (préférablement celui centralisé dans la classe Client) doit retrouver les données du client traité et construire l'objet convenablement. Car il ne faut pas croire que la fonction statique pourra alimenter des objets. C'est à chaque objet de s'auto-construire. C'est pour ça qu'un constructeur est obligatoire si l'objet doit remplir ses propriétés automatiquement à partir de la base selon des paramètres déclencheurs.
Voici un exemple de ce mécanisme:
<pre>
<?php
class Client
{
public $nom;
public $prenom;
public $type;
public function __construct($CB_Data=null)
{
$data = $this->getData($CB_Data);
if ($data != null)
{
$this->nom = $data['nom'];
$this->prenom = $data['prenom'];
$this->type = $data['type'];
}
}
public static function getClient($CB_Data)
{
$data = Client::getData($CB_Data);
return $data['type'] != 'particulier' ? new Professionel($CB_Data) : new Particulier($CB_Data);
}
public function getData($CB_Data)
{
// Simulation de recherche des données client
if ($CB_Data['nom']== 'Dupont' && $CB_Data['prenom']== 'Jean' && $CB_Data['secret']== '123')
{
return array('nom'=>'Dupont', 'prenom'=>'Jean', 'type'=>'particulier', '...'=>'...'); //données de la base de données
}
return null;
}
}
class Professionel extends Client
{
}
class Particulier extends Client
{
}
//
$CB_Data = array('nom'=>'Dupont', 'prenom'=>'Jean', 'secret'=>'123');
$mon_client = Client::getClient($CB_Data);
//
echo "<p>Données de la carte CB :</p>";
print_r($CB_Data);
echo "<p>Objet Client identifié:</p>";
print_r($mon_client);
?>
</pre>
La fonction statique getClient reçoit les paramètres du tableau $CB_Data, recherche le client et notamment son type pour décider d'instancier un objet particulier ou professionnel, et par la même, retransmet les paramètres du tableau $CB_Data au constructeur de l'objet instancié.
De cette manière, l'objet instancié, utilise le constructeur de la classe mère Client pour remplir ses propriétés héritées.
Le constructeur de la classe Client, ici, sert plus pour construire les sous-objets particulier et professionnel.
La fonction statique getClient, ne doit pas utiliser directement les propriétés de la classe Client car elle n'a pas pour vocation de construire un objet Client et de toutes façon, quand elle s'exécute dans un mode statique, elle ne pourra pas accéder à des propriétés non statiques et ça sert à rien dans notre cas, car elle pourra utiliser la fonction getData pour obtenir directement les données de la base de données du client recherché et en autre son type, pour décider quel sous-objet instancier.
----
Moralité: Veillez sur la relation avec votre famille, car vous pouvez vous retrouver à travers elle.
