pb passage en parametre d'objet (private+serialize+php5)

niiiko
Invité n'ayant pas de compte PHPfrance

18 févr. 2005, 12:35

Bonjour,
Je travaille sur un projet php5.

- J'ai une classe 'client' possedant plusieurs attributs et methodes.
- j'instancie cette classe.
- Je serialize l'objet ($sobj = serialize($obj);)
- Je passe l'ojet serialisé à une autre page (href='./page_modif_client.php?sobj=$sobj')
- Je deserialise l'objet dans la nouvelle page et je l'utilise.

Voila, tout se passe bien tant que toutes les attributs de la classe 'client' sont public.
$sobj contient alors:
O:6:"client":3:{s:13:"client_nom_id";s:3:"rrr";s:10:"lieu_siege";s:7:"inconnu";s:9:"phone_num";s:7:"inconnu";}

Si j'en met 1 attribut en private
$sobj contient alors:
O:6:"client":3:{s:21:"clientclient_nom_id";s:3:"rrr";s:10:"lieu_siege";s:7:"inconnu";s:9:"phone_num";s:7:"inconnu"

;}

ce qui est un peu bizarre, et surtout rend impossible la deserialisation.
(à noter que j'utilise une methode 'get' public pour recuperer mon attribut private).
je ne sais pas d'ou vient ce probleme et je n'arrive donc pas à le résoudre.

J'espere que vous pourrez m'aider. Merci d'avance
Niiiko

Administrateur PHPfrance
Administrateur PHPfrance | 250 Messages

18 févr. 2005, 15:46

bonjour

dis moi pourquoi faire passer un objet dans l'url?
pourquoi pas par des sessions
question secu, cela serait surement plus judicieux...

Eléphant du PHP | 67 Messages

18 févr. 2005, 15:50

Contrairement aux langages orientés objet (C par exemple) les attributs(propriétés et méthodes) d'une classe PHP ne peuvent être déclarées protected, private ou public ca parait d'ailleur logique pkoi voudrais tu avoir un element de type private ?!? puisque seul ton serveur meme pas toi pourrait y accéder !

Administrateur PHPfrance
Administrateur PHPfrance | 250 Messages

18 févr. 2005, 15:51


Eléphant du PHP | 67 Messages

18 févr. 2005, 15:56

ouch je ne savais pas et bien je vais me documenter merci :oops:

Eléphant du PHP | 67 Messages

18 févr. 2005, 18:00

La visibilité d'une propriété ou d'une méthode peut être définie en préfixant la déclaration avec le mot-clé : public, protected ou private. Les éléments déclarés publics public peuvent être utilisés par n'importe quelle partie du programme. Les éléments protégés protected limitent l'accès aux classes héritées (et à la classe qui a définie l'élément). Les éléments privés private limitent la visibilité uniquement à la classe qui les a définis.
Maintenant que je pense avoir saisie le principe je pense que ton erreur dois se situer dans la déclaration de ta classe ou plutot sa redeclaration.

Imaginons qu'on passe une classe par URL ou par une session... si tu ne redeclare pas ta classe en redifinissant sa structure avant de la "deserialiser" (avoir oublier d'inclure sa structure contenu dans un fichier *.inc par exemple) logiquement PHP aurra aucune facon de vérifier que tel ou tel attribut est public ou privé... a vrai dire je ne sais pas comment il pourrait faire pour gérer ca :shock: ca m'intéresse beaucoup d'ailleur de savoir comment il fait si je me trompe ... :D

Je pense donc qu'il doit falloir faire une redeclaration de la classe dans la page qui recoit la classe ceci avant de faire un unserialize.

Eléphant du PHP | 67 Messages

18 févr. 2005, 18:24

Décidément ton probleme est intéressant :)...

Essaye de voir ce que renvoie ceci :

Code : Tout sélectionner

var_dump($sobj); // n'affiche que les donnée public var_export($sobj); //affiche les protected et les privates avec php5
Tien moi au courant ;)

Invité
Invité n'ayant pas de compte PHPfrance

18 févr. 2005, 22:53

pour la redeclaration de la classe, c'etait bon: j'ai inclu le fichier contenant la classe dans les 2 pages qui en ont besoin.

je vais essayer var_export pour te dire ce que ca retourne, mais je crois pas que ca nous avancera a grand chose.

En tout cas merci pour votre aide! c sympa

Invité
Invité n'ayant pas de compte PHPfrance

18 févr. 2005, 23:18

voici ce que renvoie var_export apres la creation de l'objet:
class client { private $client_nom_id = 'mimi'; public $lieu_siege = 'pari'; public $phone_num = '12'; }

et voila ce qui l'affiche apres le passage dans l'url:
false

logique vu qu'il passe une donnée éroné lorsqu'il passe l'objet en paramètre.

niiiko
Invité n'ayant pas de compte PHPfrance

19 févr. 2005, 16:27

resolu: il fallait utiliser 'urlencode()' pour encoder l'objet avant de le passer en paramètre. Merci à olivier pour son aide.

Eléphanteau du PHP | 25 Messages

26 nov. 2008, 15:57

on pourra utiliser les sessions ou cookies pour eviter l'utilisation de urlencode
bonne chance