[PHP5] XML OBJECT SERIALIZER/UNSERIALIZER

Skaaar Messages postés 18 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 21 avril 2006 - 24 mars 2006 à 15:43
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 5 juil. 2006 à 14:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36671-php5-xml-object-serializer-unserializer

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
5 juil. 2006 à 14:10
SKAAR => désolé, je n'avais pas vu ce message!! Je viens de le voir...donc, je réponds :
je suis en php 5.1.4 je crois (enfin, la dernière).
Pour ce qui est des extensions, attention...je n'utilise pas DOMXML, mais DOM (la version php5). Ce qui est très différent. A mon avis tes problèmes viennent de là. Tu montres la librairie XML, que je n'utilise pas ici. Vérifie que DOM soit installée correctement.
Et effectivement, mon script ne fonctionne pas en PHP4.3.10 puisqu'il utilise la syntaxe PHP5 exclusivement (notamment côté POO).
Skaaar Messages postés 18 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 21 avril 2006
21 avril 2006 à 11:30
Malalam > Quelle version de php et des librairie utilises tu ? J'ai perdu le numéro de la version de php avec lequel j'avais testé, et là ya plus rien qui marche :(
J'ai des méthodes qui n'existe pas (entres autres : DomDocument::load(), DomDocument::loadXML(), domxml_xslt*(), ...) Ce qui est génant pour adapté un XSLT au XML et afficher le tout.
J'ai essayé de aussi de passer par :

<?php

$xml = domxml_open_file('aze.xml');
$xsl = domxml_open_file('aze.xslt');

$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
?>
Qui a mon sens devrait reprendre l'exemple qui est là : http://www.php.net/manual/en/function.xsl-xsltprocessor-transform-to-doc.php#AEN200744 sans utilisé la méthode load(). Mais j'ai une erreur à la ligne 7 (importStyleSheet($xsl)) : 'Warning: Invalid Document in g:\SambaMod\www\aze.php on line 7'.

Je me suis aperçu également que certaine méthodes que tu utilisais était 'deprecated' : http://www.php.net/manual/en/ref.domxml.php#domxml.deprecated

Voici un extrait de mon phpinfo validant le bon chargement de mes librairies :

xml

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.6.22

xsl

XSL => enabled
libxslt Version => 1.1.15
libxslt compiled against libxml Version => 2.6.22
EXSLT => enabled
libexslt Version => 0.8.12

Existe-t'il des nouveaux noms pour les méthodes ? est-ce que les docs sont à jour ? Est-ce que j'utilise une version de PHP trop 'beta' (PHP5.1.2 pour windows) ? Est-ce que c'est parceque j'utilise PHP en ligne de comande ? Tant de question que je me pose et qui n'aboutissent à rien :'(
Si tu as quelquechose qui pourrait m'éclairer (autre qu'une source lumineuse ;) ), je t'en remercie.

Cordialement,

Scar.

PS : Ton script ne fonctionne pas avec EasyPHP1.8 (PHP4.3.10)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mars 2006 à 07:49
Yep, merci encore Kankrelune :-)

Si t'as des idées d'améliorations, n'hésites pas :-)

Je pense sous peu (bien qu'en l'état il me suffise pour le moment, pour mon utilisation) ajouter la possibilité de linéariser aussi les propriétés protégées et privées (avec comme condition l'ajout dans la classe à linéariser d'un setter et d'un getter spéciaux, c'est le seul moyen viable). Et je dois aussi me pencher sur les constantes et les statiques...que je ne prends pas en compte, là.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
31 mars 2006 à 07:45
" Merci kankrelune, c'est flatteur venant d'un codeur comme toi :-)"

Ah non... c'est toi qui me flatte là... je me débrouille certe mais ça s'arrête là... .. . ;o)

Bon et bien sérialiseur testé... et approuvé... .. . :oD

Je met 9 parce que bien que le code demande quelques améliorations il tourne bien en l'état et surtout l'idée est très bonne et mérite bien ça... .. . :o)

@ tchaOo°
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mars 2006 à 07:30
De rien :-) En plus, t'as dû prendre la 2de version, qui elle, n'est plus buggée : l'affichage devrait toujours être ok.
Skaaar Messages postés 18 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 21 avril 2006
31 mars 2006 à 02:29
Yes ! Merci ça gère :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 mars 2006 à 10:52
Update spécial SKAAAR =>
j'ai mis en place une première version d'affichage du xml généré. Pour l'utiliset il suffit de faire un echo de l'objet xmlserialize:
$oxml = new xmlserialize ($obj);
echo $oxml; // par exemple

Si le xml a été généré via la méthode varsToXml-), le xml sera affiché grâce à l'utilisation de l'extension XSL de php. IL va sans dire qu'il faut l'activer (elle l'est rarement par défaut) dans le php.ini : avec l'objet XSLTProcessor.

Sinon, un export des propriétés de l'objet pouvant être linéarisées est affiché.

Je précise que ce n'est qu'une première version parce que la mise en forme du XML via des listes est un peu buggy ;-) Je rencontre un petit problème dans la génération de ma XSL. Problème que je cerne très bien, lol, mais je n'ai pas encore trouvé le moyen de le règler.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 mars 2006 à 08:14
Après une très courte réflexion, lol, je vais peut-être ajouter une méthode affichant le xml de plus jolie façon...ça ne peut pas faire de mal après tout. Et ce ne serait pas illogique.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 mars 2006 à 08:11
Hello Skaaar :-)

- la mise en forme : hors de question! Lol... ;-) Non, je ne mettrai pas en forme le xml dans cette classe, ce n'est pas le but. Et il est hors de question que j'ajoute des retours chariots dans mon flux xml, en plus! Par contre...je peux ajouter une petite xls au zip...ou fournir un script php qui génère du xls, pour visualisation, pourquoi pas!

- je pensais avoir été clair sur les propriétés publiques, apparemment pas : donc oui, tu as raison, cette classe ne peut linéariser (et à fortiori, délinéariser) que les propriété publiques d'une classe. Pour le moment! Je pense aujourd'hui donner la possibilité d'ajouter aux classes qu'on veut linéariser, un getter et un setter particuliers, dédiés à cette linéarisation (sans que ce soit obligatoire, évidemment : sans, c'est comme aujourd'hui. Avec, cela permettra de linéariser/délinéariser les propriétés privées, protégées aussi).

Sinon, heureux que ça te serve :-) Je joindrai bientôt un exemple concret d'utilisation, à vrai dire. Je pense que ce serair utile.
Skaaar Messages postés 18 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 21 avril 2006
28 mars 2006 à 01:00
Petites remarques après un peu d'utilisation :
- Un pti peu de mise en forme dans le code xml ça serait pas mal, genre avec des retours chariot :p (quoi que je crois que c'est plus à moi de le rajouter ça)
- Ca peut paraitre bête, mais pour ceux qui débute en POO php il faut préciser que ça ne marche qu'avec des attributs public :)

Sinon personnellement ça m'est pratique pour charger la config de mon site web et la langue de l'utilisateur.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 mars 2006 à 15:46
Mais bon, ok, c'est quand même pas joli , donc je le vire ;-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 mars 2006 à 15:28
Bah disons que c'est un snippet ;-) Je ne veux pas que l'exécution s'interrompe si on a pas d'objet.
Après, le codeur qui utilisera cette classe, lui, est libre de retourner une erreur.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
27 mars 2006 à 15:12
Rhooo j'avais pas vu !! Y'a un truc qui vient tout juste de me chiffoner :D

"# public function __construct ($obj, array $oPropObj = array ()) {
# if (!is_object ($obj)) {
# return false;


Rhoo depuis quand un constructeur retourne quelque chose ???
Un ptit coup d'exception ou un trigger_error, y'a que ca qui fonctionne dans un constructeur :D

Bon moi niveau XML c'est pas encore tout à fait ca, je suis en train de m'y pencher donc je vais pas regarder en profondeur non plus tout de suite :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 mars 2006 à 14:48
La sérialisation ne pose pas de problème, à vrai dire :-) Le xml généré contient tout.
C'était à la désérialisation que ça posait problème.

C'est réglé, mais il manque encore 2- 3 trucs...
Mais en l'état je ne peux rien faire de plus, je vais réécrire cette classe pour qu'elle soit un peu plus malléable.

Mais bon, là, c'est fonctionnel déjà :-) : les tableaux multi sont pris en compte, ça va, idem pour les propriétés qui sont elles-mêmes des objets, depuis ce matin :-)

mais je pense qu'en cas de gros tableau avec une profondeur...heu...profonde ;-) ça doit poser problème quand même (je me suis embrouillé dans ma récursivité lors de la délinéarization lol, je crois). Pour les tableaux d'objets, par contre, ça devrait aller.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
27 mars 2006 à 14:43
"quand ujne propriété est elle-même un objet, ou un tableau multidimensionnel. " Serialise ta propriété en premier. Puis sérialise le reste :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
25 mars 2006 à 19:40
Merci kankrelune, c'est flatteur venant d'un codeur comme toi :-)
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
25 mars 2006 à 15:46
Je ne dirais qu'un mot... bravo... .. .

L'idée est plus que bonne et commençant à connaitre tes connaissances en la matière je ne doute pas du résultat... .. . :o)

Je test et je noterais dans la foulée... .. . ;o)

@ tchaOo°
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 mars 2006 à 17:22
Enfin, plus exactement... : le xml généré est correct, toutes les infos y sont.
C'est dans la régénération de l'objet que j'ai buggé quand ujne propriété est elle-même un objet, ou un tableau multidimensionnel.
Ceci dit, ce n'est pas grand chose, il faut juste que je trouve un peu de temps pour corriger ça.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 mars 2006 à 17:15
Merci :-)
Une réaction lol...(je savais que ce code n'intéresserait que TRES sporadiquement ;-).
Il subsiste un bug, néanmoins, que je n'ai pas eu le temps de corriger (2 en fait) :
- tableaux multidimensionnels non pris en compte (mais je le ferai bientôt)
- propriétés contenant des objets non prises en compte (pareil, je ferai ça bientôt).
Skaaar Messages postés 18 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 21 avril 2006
24 mars 2006 à 15:43
Niquel ! Code très propre et très pratique !

Merci !
Rejoignez-nous