Ouh là, ça se complique. :/
Je manipule plusieurs classes, en fait. En simplifiant le plus possible, j'ai quelque chose dans ce goût-là :
[...]
Dans ma première classe, j'utilise une fonction qui va récupérer des infos dans une base de données selon différents critères (pour simplifier, on va dire qu'elles sont récupérées sous forme d'un tableau) et je crée plusieurs instances d'une seconde classe (photo) pour gérer mes diverses photos.
Dans la classe photo, je voudrais pouvoir récupérer le nom de l'instance pour l'utiliser dans la méthode magique __toString afin de créer un champ de formulaire.
Le but est d'obtenir, après validation du formulaire, les variables $_POST avec les bons noms (dans cet exemple $_POST['photo_avant'] et $_POST['photo_apres']) pour pouvoir automatiser leur traitement à coup de
Je ne comprends pas bien à quoi sert le "singleton" et je ne crois pas qu'il puisse m'aider pour générer mes champs de formulaire.
Ca permet d'avoir qu'une Instance... L'intéret est multiple. Le plus classique est l'accès aux DB.
Je parlais pool dans le précédent post, je pense que tu peux tenter de t'orienter par la. Petit exemple:
L'enregistrement se fait sur toutes instances.
abstract class Toto
{
// Tableau des instances
//
private static $arrayPool = Array();
// Même principe que le Singleton: Ni New & ni Clone
//
private function __construct()
{
}
private function __clone()
{
}
// Initialisation
//
function static register($name, $mixed)
{
if (!is_string($name)) die ("Argument attendu de type chaine !");
if (isset(self::$arrayPool[$name])) die ("Argument invalide, ID déja référencé !");
if (!is_object($mixed) && !is_string($mixed)) die("Argument attendu string ou instance !");
if (is_string($mixed) && !class_exists($mixed)) die("La class est introuvable !");
self::$arrayPool[$name] = is_object($mixed) ? new $mixed() : $mixed;
return self::$arrayPool[$name];
}
// Récupère l'instance
//
function static getInstance($name)
{
if (!is_string($name)) die("Argument attendu de type chaine !");
if (isset(self::$arrayPool[$name])) die ("Clef inconnue, instance introuvable !");
return self::$arrayPool[$name];
}
.
.
.
}
Voila, une class de pool d'instances (ce pattern porte un nom mais j'ai un trou. L'appel se fait par
(instance)Toto::register("clef", "nom de class");
(instance)Toto::register("clef", Instance);
(instance)Toto::getInstance("clef");
Le retour est biensur l'instance de l'objet venant d'être enregistré. A toi de modifier/adapter...
J'oubliais tu as aussi la variante qui est: Utiliser comme instance le parent de la class utilisée
pour le pool.
Exemple rapide:
// La class qui sera enregistrée
//
class ParentToto
{
// En admétant qu'on ne veuille l'instancier
//
protected function __construct()
{
}
private function __clone()
{
}
.
.
.
}
abstract class Toto
{
// Tableau des instances
//
private static $arrayPool = Array();
// Initialisation
//
function static register($name)
{
if (!is_string($name)) die ("Argument attendu de type chaine !");
if (isset(self::$arrayPool[$name])) die ("Argument invalide, ID déja référencé !");
self::$arrayPool[$name] = new parent();
return self::$arrayPool[$name];
}
// Récupère l'instance
//
function static getInstance($name)
{
if (!is_string($name)) die("Argument attendu de type chaine !");
if (isset(self::$arrayPool[$name])) die ("Clef inconnue, instance introuvable !");
return self::$arrayPool[$name];
}
.
.
.
}
Voila, je pense que tu as un peu plus de matos pour réaliser ce que tu veux.
@+ bon code
PS: Après relecture de ton post, mon exemple
1 semble correspondre à ce que tu cherches.
EDIT:
1) Désolé j'ai fais avec moins de commentaires mais bon...
2) Possible qu'il y ait 1 ou 2 coquilles mais à vu de nez le script est bon