Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour
Est-ce que quelqu'un a déjà eu cette erreur ?
Catchable fatal error: Object of class __PHP_Incomplete_Class could not be converted to string in /home/julien/public_html/MyZend/Zend/Locale.php on line 834
De quoi est-ce que cela peut provenir.
Le plus étrange c'est que ça ne se produit pas tout le temps.
Hors ligne
Hello,
Quelle version de PHP et du ZF ?
A+
Hors ligne
PHP 5.2.6
ZF 1.7 PR
C'est peut-être à cause de la version ZF ? Mais alors pourquoi cela ne se produit pas à tout les coups ?
Hors ligne
Hello,
C'est une preview release. Il y a beaucoup de changement sur le trunk depuis la sortie de la 1.7PR concernant Zend_Locale. Essayes de te brancher sur le trunk SVN ou attends la 1.7RC qui ne devrait plus tardé.
A+
Hors ligne
ce la vient du fait que tu as mis en session un objet et que lorsque tu ouvre la session ensuite tu n'as pas chargé la classe.
Solution 1) (ma préféré) tu convertis ton objet en stdClass object avant de le mettre en session ainsi il peut voyager n'importe où (session échange de donnée sérialisés enregistrement dans un fichier etc.) on ne garde que les valeurs. mais tu perds la classe lorsque tu le récupère il te faut donc recréer l'instance si nécessaire.
Solution 2) mettre en marche le système autoload de Zend. la classe est chargée automatiquement par Zend à l'ouverture de la session et l'objet retrouve sa classe d'origine. Mais la classe sera systématiquement chargé même si tu ne t'en sert pas dans l'action courante. si tu ne fais pas correctement le ménage tu peut te retrouver à charger pas mal de chose inutile. (quelque soit la solution il faut toujours faire son ménage dans la session)
Solution 3) serialiser l'objet avant de le mettre en session. avantage ce n'est qu'une chaîne de caractère qui est mise ne session donc plus de pb. la chaîne est récupéré à chaque ouverture de session comme pour toute la variables. comme c'est une String pas de chargement de classe ni de message d'erreur. il faut pour utiliser l'objet charger la classe et déserialiser. deux inconvénients on fais deux serialisation et deux désérialisation. (la session en fait toujours une à l'ouverture et la fermeture) mais sur tout il n'est pas possible d'utiliser l'objet en session directement. on a donc obligatoirement une copie hors session pour l'utiliser.
les trois approche ont leur aficionados. j'utilise la première car pour moi la session est la pour garder des données pas des méthodes. mais c'est façon de voir les choses.
pour me faciliter la vie mes objets on tous une méthodes _toStdClass qui retourne une copie de l'objet ne contenant que les données. dans l'autre sens mes constructeurs accepte un stdClass object comme argument pour rétablir l'instance. (ce genre de constructeur est appelé constructeur de recopie dans la littérature de la POO)
pour avoir un stdClass object il suffit de faire
(object)get_object_vars($myObject);
A+JYT
Hors ligne
Ca c'est de la réponse, merci
Je pense que je vais opter pour la solution 1 ou 2... dès que j'aurai trouvé l'endroit où je mets un objet en session, apparemment un Zend_Date dans ce cas-là. Parce que pour le moment je ne vois pas où j'ai pu faire ça
Hors ligne
bonjour,
Pour compléter la solution et les problèmes de mise en session d'objet:
lors de la mise en session d'un objet, il est sérialisé par php donc la methode __sleep() est appelée.
Lors du "chargement de l'objet" la methode __wakeup() est utilisé.
C'est très utile si vous avez des champs qui sont par exemple des dateTime qui ne sont pas serializable par php .
exemple :
function __sleep(){ if ($this->date_ouverture_compte instanceof DateTime ){ $this->date_ouverture_compte = $this->date_ouverture_compte->format(DateTime::W3C); ...... $reflex = new ReflectionObject($this); $tableau = $reflex->getProperties(); $retour = array(); foreach ($tableau as $propriete){ $retour[] = $propriete->name; } return $retour; } function __wakeup(){ $this->date_ouverture_compte = new DateTime($this->date_ouverture_compte); .... }
ps : je suis plutot méthode 2 ;-) d'où ce bout de code
Dernière modification par ichevc02 (03-11-2008 11:41:13)
Hors ligne