27-06-2010, 07:37 PM
(27-06-2010, 03:18 PM)Anthor a écrit : Sinon tu peux utiliser get_called_class :je connaissais pas cette méthode mais c'était ce que je recherchais à l'origine
![Smile Smile](https://jeuweb.org/images/smilies/smile.png)
(27-06-2010, 03:18 PM)Anthor a écrit : A partir de php 5.3, tu peux utiliser le "Late Static Bindings". En gros ça te permet d'avoir le nom de la classe appelé durant l'exécution avec le mot clé static.cette partie là est plus hard core, mais elle me plait bien, faut que je regarde si je pense pouvoir la maintenir ^^
On remarquera que l'exemple utilise le nouvel opérateur ternaire qui permettre d'omettre la partie centrale.
(27-06-2010, 03:18 PM)Anthor a écrit : Il y a d'autres possibilités, par contre ne pas confondre le singleton et le factory.pas sûr d'avoir bien compris, j en arrive à la suite
Si t'as factory est unique ou héritée, alors elle ne sert pas à instancier d'autres classes.
La tu as uniquement un singleton, d'après tes explications.
(27-06-2010, 03:18 PM)Anthor a écrit : Avec plus de code on pourrait surement mieux cibler le besoin.le problème c'est la taille du code à analyser, je ne sais pas trop quoi publier mais voici quelques illustrations
Code PHP :
<?php
/* méthode pour générer les objets dans la classe mère (j'ai épuré d'un certain nombre de contrôle et tests)*/
/**
* Méthode "par défaut" qui enregistre un nouvel objet si celui ci n'est pas déjà enregistré.
* le comportement pour l'objet principal (et non un de ses modules) est
* vérifie que l'objet n'est pas déjà créé => _donnees[ champ(cle) ] inexistant
* si pas créé, stock l'objet dans _donnees[ champ(cle)]
* @param res tableau résultat de la lecture sql, indicé par les champs
* @param module correspond au nom du module à charger
* @since 1.0
* @return true si chargement s'est bien passé, false sinon (que ce soit erreur ou déjà présent)
*/
protected function Enregistre($res, $module)
{
$objetRes = $this->CreerObjet($res);
if ( false === $objetRes )
return false;
if (!isset($this->_donnees[ $res[ $this->_infosRequetes[$module]['cle'] ] ]) )
{
$this->_donnees[ $res[ $this->_infosRequetes[$module]['cle'] ] ] = $objetRes;
return true;
}
else
return false;
}
}
/* à noter la méthode CreerObjet dépend de la classe fille */
// exemple pour la "factory" personnage, du très simple
public function CreerObjet($res)
{
return new classRootPersonnage($res);
}
// exemple pour la "factory" action, du plus compliqué
public function CreerObjet($res)
{
// si l'action est déjà partiellement chargée, on continue, sinon on crée une nouvelle action
if (isset($this->_donnees[ $res[ $this->_infosRequetes['_']['cle'] ]] ))
$action = $this->_donnees[ $res[ $this->_infosRequetes['_']['cle']] ];
else
{
if (!isset(self::$_classes[$res['id_classe']]))
throw new classErreur (NULL, 999, array( 'id_classe' => $res['id_classe']) );
$classe = self::$_classes[ $res['id_classe'] ];
$action = new $classe($res);
}
if ($res['type'] !== NULL)
{
if (!isset(self::$_modules[$res['type']]))
throw new classErreur (NULL, 999, array( 'type' => $res['type']) );
$action->CreerModule( ClassBDDListeActions::$_modules[$res['type']] );
$action->getModule(ClassBDDListeActions::$_modules[$res['type']])->addContrainte($res);
}
return $action;
}
en tout cas merci !