passage des objets par session

Eléphant du PHP | 120 Messages

21 avr. 2006, 16:01

slt a tous,

je cherche a faire passer un objet par une session. j'ai vu dans de la doc qu'il etait possible de le faire par linearisation avec la fonction serialise().
mais j'ai aussi vu qu'il fallait d'abord passer par "la methode" _sleep() si il y avait dans cet objet des connexions a une bdd. or c'est le cas pour moi, mais malheureusement j'ai pas pité le fonctionnement de cette methode. selon cette meme doc, il faut je crois redefinir cette méthode, mais ce que je comprends pas surtout c'est ce qu'elle doit contenir. pourriez vous m'éclairer sur tout ca svp ? merci.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 avr. 2006, 16:38

Quel est l'interet pour toi de passer un objet en session ?

L'un des avantage de l'objet, c'est que tu peut créer des méthodes pour charger aisement les données.

A partir de là, tu n'as qu'a mettre l'identifiant de l'objet en session, et dans chaque page, tu créés un nouvel objet avec cet identifiant
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 120 Messages

21 avr. 2006, 16:44

un identifiant de l'objet ? il sort d'ou cet identifiant ? et puis si je crée un nouvel objet avec ce meme identifiant, les autres parametres ne seront pas initialisés aux memes valeurs que l'ancien objet. a moins de passer chaque valeur des parametres de l'objet par la session, dans ce cas je ne vois pas trop l'interet de faire un objet.
merci de vos reponses.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 avr. 2006, 16:46

D'où sortent les données que tu mets dans ton objet ?

Si c'est d'une base de données, ton tuple doit bien avoir un identifiant ? c'est de celui-ci dont je te parle... ;)

Ensuite, si c'est des données que tu récupères d'un formulaire par exemple, il te faut les enregistrer avant de changer de page

etc ...

A mon sens, c'est une erreur de developpement de passer des objets en session
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 120 Messages

21 avr. 2006, 16:47

merci de repondre a mes question zeus, j'ai vu que tu as répondu a ma question sur les deux sujets. j'ai réecri sur le 2nd car je l'avais pas vu tout a lheure et comme ca traite de la meme choz, donc j'ai remonté le sujet, il est plus complet l'ancien. mais en repondant a l'un on répond aux deux.

Eléphant du PHP | 120 Messages

21 avr. 2006, 16:53

je suis bien d'accord avec toi, mais dans ce cas je vois pas trop l'interet de l'objet car la session joue bien ce role (a part pour les methodes mais qu'on peut remplacer par de simples fonctions). en + il faudra a chaque fois passer par une étape d'initialisation de l'objet nouvellement créé. ne serait-ce pas plus "judicieux" de passer l'objet et de l'utiliser directement avec les methodes et les parametres qu'il possede ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 avr. 2006, 17:08

Si tu crée une méthode d'initialisation simple, je ne suis pas sûr que ça soit moins performant

Imagine comment tu vas combler ton serveur avec la taille des sessions qui vont découler de tes serialisation ...
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 1311 Messages

21 avr. 2006, 17:16

salut

session_start();
require Obj.class.php;
$obj = new Obj();
$_SESSION['obj'] = $obj;
normalement php serialize l'objet tous seul
require Obj.class.php;
session_start()
$_SESSION['obj'] ->mamethod();
__sleep et __wakeup de permettent de choisir les données à mettre en session

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 avr. 2006, 17:24

A mon sens, c'est une erreur de developpement de passer des objets en session
Pas nécessairement non, il suffit de les utiliser intelligement et avec parcimonie :)

J'ai un site sur lequel les utilisateurs s'authentifient pour poster des contributions. Sur chaque page, j'ai besoin de connaitre leur id, pseudo, droits, et pas mal d'autres informations. Donc pas vraiment envie d'interroger la base à chaque page pour récuperer toujours les mêmes valeurs.

Je pourrais bien sur mettre les valeurs en session dans des variables, mais l'avantage de l'objet est que je profite également de toutes les méthodes : en cas de modification de l'objet, j'appel un update et l'enregistrement en base se fait automatiquement, pas besoin de reprendre mes valeurs et de ré-écrire un update.
De même, lorsque je set un attribut, tous les contrôles (format, taille, etc.) sont fait automatiquement, ce qui simplifie grandement mon code.

C'est le seul objet que je passe en session (pour le reste je me contente également juste d'un identifiant) mais je garantie que j'apprécie de l'avoir celui là :) Je ne pense donc pas que ce soit une erreur, faut juste pas vouloir tout passer en session et se demander si ca vaut vraiment la peine :)

Eléphant du PHP | 120 Messages

21 avr. 2006, 17:26

si ca prend plus de ressources qu'une session simple avec qlq parametres de base, dans ce cas c pas tré interessant de faire passer l'objet en lui meme. par contre, j'ai pas compri le coup du _sleep et du _wakeup(). jeff pourrai tu m'expliker un peu mieux stp ces fonctions. ou encore, comme on dit un schéma vaut mieux qu'un long discours, alors un exemple serai la bienvenue.
merci les gars.

Eléphant du PHP | 120 Messages

24 avr. 2006, 10:02

yo jeff,
j'ai essayé ske tu ma donné mais ca marche pas. en faite ca me donne l'erreur suivante :

Code : Tout sélectionner

Fatal error: Unknown(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>utilisateur</b> of the object you are trying to operate on was loaded _before_ the session was started in e:\program files\easyphp1-8\www\professionnalisation\accueil.admin.php on line 7
la ligne 7 contient ceci :
  echo "bonjour ".$nom." ".$prenom." ".$_SESSION["user"]->getnom();
user est un objet que j'ai tenté de faire passer comme dans l'exmple que tu as donné. si tu as un élément de réponse ou autre je suis preneur. et si klkun voi ce que c que le pb, merci de bien vouloir m'aider la dessus.

Mammouth du PHP | 1311 Messages

24 avr. 2006, 12:24

salut
avant d'utiliser ton objet il faut appeller la class
require 'user.class.php';
echo "bonjour ".$nom." ".$prenom." ".$_SESSION["user"]->getnom();

Eléphant du PHP | 120 Messages

24 avr. 2006, 15:17

ca me fait la meme chose. j'ai inclu la classe qui se trouve dans le fichier class.php par cette ligne :
require("class.php");
ensuite j'ai saisi la ligne comme noté :
echo "bonjour ".$nom." ".$prenom." ".$_SESSION["user"]->getnom(); 
j'ai obtenu le meme résultat. ensuite j'ai essayé par cette ligne :
echo "bonjour ".$nom." ".$prenom." ".$_SESSION["user"]->nom;
et la j'obtiens ceci :
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>utilisateur</b> of the object you are trying to operate on was loaded _before_ the session was started in e:\program files\easyphp1-8\www\professionnalisation\accueil.admin.php on line 8
la ligne 8 étant la ligne décrite plus haut.
merci de vos réponses.

Mammouth du PHP | 1311 Messages

24 avr. 2006, 15:28

heu pardon j'ai pas été assez precis l'inclusion doit se faire avant la declaration de la session

Eléphant du PHP | 120 Messages

24 avr. 2006, 16:26

ah non ! j'accepte pas la ! tu me donne pas les explications avec précision je suis pas d'accord la !!!! lol.
c cool mon pote !!!!!! ca marche nikel. merci bcp. c2la bombe amigo !!!!!!
merci encore.
mais au faite, une derniere question. j'ai un objet qui établi une connexion à une bdd, de ce que j'ai compri la linéarisation est un moyen un peu trop brutal pour ce genre d'objet, et j'ai essayé de me documenté sur les _sleep et _wakeup mais c trop vague j'y comprend pas grand chose. dans le cas ou la connexion serait coupée par la linéarisation, peux tu me faire part de tes connaissances concernant ces deux fonctions stp. merci