Bonjour,
J'ai un nouveau problème dans le passage d'objets dans les sessions.
Je passe un objet Formulaire qui possède un attributs $champs.
Dans ce tableau j'ai ajouté préalablement des objets héritant de la classe Champ.
Quand je récupère ce tableau après avoir désérialisé l'objet Formulaire, je suis obligé d'inclure toutes les classes ChampTexte, ChampMDP, ListeDeroulante... avant d'utiliser une méthode de la classe Champ sur cet objet.
Plus concrètement :
1 2 3 4 5 6 7 8 9 10 11 12
| class Formulaire{
private $champs = array();
public addChamp($champ){
$champs[] = $champ;
}
public getChamps(){
return $champs;
}
} |
1 2 3
| class Champ{
traiteChamp();
} |
class ChampTexte extends Champ{}
class ChampMDP extends Champ{}
page1.php
1 2 3 4 5 6 7 8
|
$form = new Formulaire();
$champTexte = new ChampTexte();
$champMDP = new champMDP();
$form->addChamp($champTexte);
$form->addChamp($champMDP);
$_SESSION['formulaire'] = serialize($form);
header('Location: page2.php'); |
page2.php
1 2 3 4 5
|
$form = unserialize($_SESSION['formulaire']);
foreach($form->getChamps() as $champ){
$champ->traiteChamp();
} |
Résultat : Dans la page page2.php je suis obligé d'inclure les fichiers ChampTexte, ChampMDP alors que la méthode qui m'intéresse est uniquement la classe Champ
Y a t il un moyen de faire autrement ?
Si le PHP était typé $champs serait déclaré en tant que Collection<Champ>, mon foreach m'aurait retourné un Champ et là je n'aurais pas eu de problème...
En outre, j'ai essayé dans mon foreach de récupérer la classe de l'objet grâce à un get_class afin de faire un include à ce moment mais après désérialization ma classe est une PHP_incomplete_class... car je n'ai pas inclu la classe. C'est donc un peu le loup qui se mord la queue ^^
Effectivement c'est dommage d'inclure toutes les classe qui dérivent de champ même si je n'ai pas besoin de toutes.
Merci d'avance.
Partager