JeuWeb - Crée ton jeu par navigateur
Objets et session - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Objets et session (/showthread.php?tid=3851)

Pages : 1 2


Objets et session - Feldoran - 02-04-2009

Vaguement initié à la POO mais ne l'ayant jamais exploité à fond sur le terrain, j'ai bien envie de m'en servir pour mon projet actuel.

J'ai un bouquin sur le sujet ("PHP5" dans la collection "Les cahiers du programmeur") qui donne de bonnes pistes là dessus mais ne va pas au bout, et laisse de grosses interrogations.


En prenant la base de base...
Admettons que j'ai une classe utilisateur, qui contient grosso modo une propriété par champ de la table correspondante, plus des méthodes du type:
- verifie() qui vérifie que les données entrées à l'inscription sont ok
- inscrit() qui crée un nouvel utilisateur
- connecte() qui vérifie le login/pass saisi et connecte si ok
etc


Comment ensuite s'en servir concrètement pendant la visite sur le site?
Déjà, il n'y a pas besoin de toutes les infos sur certaines pages, donc ne serait-il pas inutilement coûteux de recharger l'objet en entier à chaque fois?
Quel devient l'usage des variables _SESSION dans le cadre d'une programmation POO?


RE: Objets et session - Zamentur - 03-04-2009

Ok, bon moi j'irais vers çà:

Lorsque l'utilisateur arrive sur le site son objet utilisateur est créé.
On serialize() l'objet afin de le mettre en session

Ainsi lorsqu'on rouvre une autre page on récupère l'objet utilisateur avec unserialize() si on a besoin uniquement évidement. Mais si tu veux avoir un historique complet des actions du joueur tu en a forcément besoin.

Ce passage dans la session et la serialisation peut (et à mon avis doit) être géré au sein même de la classe utilisateur. Notamment via un get_instance() qui deserializera l'objet si il est dans la session ou qui créra un nouvel objet et le serializera si il n'y en vais pas auparavant (première visite)

Cette méthode peut même permettre de détecter les connexions à plusieurs compte sur une même session, dans le cadre d'une lutte contre le multicomptisme.

Je sais pas si je suis clair et si il y a besoin de plus de piste?


RE: Objets et session - X-ZoD - 03-04-2009

je vois pas comment pour le multi compte

pour ce qui est des objets, je recrée a chaque page
pourquoi ? je ne sais pas .. ca coute pas plus cher que de serialiser et deseraliser un objet


RE: Objets et session - Zamentur - 03-04-2009

Citation :pourquoi ? je ne sais pas .. ça coute pas plus cher que de serialiser et deseraliser un objet
Euh çà dépend des informations que l'objet contient... Ça veut certainement dire que tu met les infos en session directement, plutôt que l'objet entier.
Dans les 2 cas çà se tient, même si çà veux dire que dans ton cas on peut accéder au membre privé de l'objet utilisateur, ce qui ne doit pas arriver normalement.

Pour ce qui est du multi c'est simple, puisque l'objet utilisateur est créé lors de la première page et non lors de la connexion. Il est possible de savoir si un joueur c'est déjà connecté à un autre compte. Car même après décconnection rien n'empêche de garder les informations du compte précédemment connecté et donc faire un lien.


RE: Objets et session - Feldoran - 04-04-2009

A voir.. je vais tester tout ça mais la doc sur le web est pas si abondante que je l'espérais sur le sujet.


RE: Objets et session - pascal - 04-04-2009

(02-04-2009, 11:21 PM)Feldoran a écrit : Déjà, il n'y a pas besoin de toutes les infos sur certaines pages, donc ne serait-il pas inutilement coûteux de recharger l'objet en entier à chaque fois?
Quel devient l'usage des variables _SESSION dans le cadre d'une programmation POO?

Que veux dire recharger l'objet en entier ?
- faire un SELECT en DB ?
- désérialiser une donnée en session ?

A+

Pascal


RE: Objets et session - Feldoran - 04-04-2009

Oui, en disant "recharger l'objet en entier" je pensais à une requête en DB qui serait effectuée sur quasiment chaque page.
Est-ce que ça se fait couramment ou peut-on trouver mieux?

La sérialisation aurait quel avantage? elle place l'objet où? dans un fichier texte géré par le serveur comme pour une session?


RE: Objets et session - naholyr - 04-04-2009

L'inconvénient de garder un objet en session est qu'on n'a aucune gestion d'erreur pour la désérialisation.

Faites un essai, en exécutant sur localhost cette page :
Code PHP :
<?php 
session_start
();

class
MaClasse {
public
$var = 'toto';
}

$_SESSION['toto'] = new MaClasse();

puis cette page sans rien d'autre :
Code PHP :
<?php 
session_start
();

Dans le deuxième cas la classe n'existe pas, mais PHP essaie quand même de désérialiser $_SESSION['toto'] et du coup bam ! fatal error.

C'est également un problème quand la classe change : comment savoir si la session utilisateur présente une instance de la classe avant modif ou après modif ? PHP a déjà désérialisé et a déjà peut-être planté avant même qu'on puisse se poser la question.

Bref : si on sérialiser un objet en session sur un serveur en production il faut être bien sûr
- que toutes les pages contiennent la classe demandée (elle sera chargée et instanciée à chaque session_start()).
- que la classe ne changera jamais de prototype (nom, attributs), ou alors si c'est le cas il faudra bien penser à supprimer toutes les sessions sur le serveur au moment du changement (pas dramatique, ça coupe juste les connexions en court mais il faut y penser sous peine de multiples crash).


RE: Objets et session - Feldoran - 04-04-2009

Oui, pour ça pas de souci, je compte utiliser l'autoload pour m'assurer que toutes les classes sont toujours accessibles en cas de besoin.
Et les changements de classe interviendront rarement, lors de changement de version pendant lesquels je rendrai le site inaccessible.

Mais ce que je me demande c'est justement si le fait de faire:
$_SESSION['toto'] = new MaClasse();
est une bonne chose ou pas?


RE: Objets et session - naholyr - 04-04-2009

Rien n'est forcément mauvais ni forcément bon, l'important c'est juste de savoir exactement ce qui se passe lorsqu'on fait quelque chose.
En l'occurrence au moment où tu fais $_SESSION['toto'] = new MaClasse() il ne se passe rien de particulier : l'objet est instancié et placé dans une variable (en l'occurrence dans le tableau superglobal $_SESSION).
En revanche à la fin de l'exécution du script il y a une phase de sérialisation de la session qui est effectuée (en gros, PHP stocke serialize($_SESSION) dans un fichier), et à chaque début de script suivant il a une phase de désérialisation de la session au début (à l'appel de session_start(), en gros PHP fait $_SESSION = unserialize(contenu du fichier)).

Cela épargne une requête, mais ça fait de l'exécution pas forcément visible. Donc quand on utilise ça, il faut juste avoir ces éléments en tête.

Perso j'en mets le minimum en session, pour éviter d'avoir à me poser ce genre de question Wink