IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Transmission d'instance d'objet via les session [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2007
    Messages : 78
    Points : 65
    Points
    65
    Par défaut Transmission d'instance d'objet via les session
    Bonjour à tous,

    J'ai un objet que j'instancie sur une première page php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    require_once("class/objet.class.php");
    session_start();
    $obj = new Objet();
    $_SESSION['obj'] =$obj ;
    ?>
    Quand je fait un print_r($_SESSION['obj']); dans cette première page, pas de soucie je retrouve bien mon instance.

    Dans ma seconde page, je souhaite récupérer mon instance, donc j'ai le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    require_once("class/objet.class.php");
    session_start();
    $obj = $_SESSION['obj'];
    ?>
    Et là, , ce n'est plus mon instance que je récupère, mais la valeur NULL.

    Je ne comprend pas pourquoi. Quelqu'un peut m'expliquer, et me dire comment récupérer mon instance?

    P.S : Mon objet n'a qu'une propriété ($connexion), qui est un objet PDO.

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Mon objet n'a qu'une propriété ($connexion), qui est un objet PDO.
    PDO ?
    Ca aurait été un Objet User (d'une classe User), pourquoi pas, mais je ne vois vraiment pas l'intérêt de stocker un Objet PDO (ou autre Bdd) dans la session, ce n'est pas une donnée nécessaire ou pertinente pour la conserver tout au long de la navigation.
    Ce qui m'interroge aussi, c'est que je doute qu'on puisse appeler une méthode de PDO sans avoir à ré-instancier à nouveau PDO, car la connexion n'y sera plus lorsque l'utilisateur demandera une nouvelle page.
    En somme, l'Objet y sera, mais pas la connexion.
    pour PDO, ça me semble un cas particulier.

    A mon sens, il serait plus intéressant de créer une classe Session, qui elle intègrerait une instance PDO, ce qui fait que seules les données utiles seront stockées dans la session (le tableau $_SESSION).
    Mais si on gère soit même les sessions, ça demandera de faire des trucs particulier car les sessions sont gérées par défaut par Php (open, close,read, write, destroy, gc).
    Voir la doc sur à ce sujet : session_set_save_handler


    Mise à part cette parenthèse, pour conserver un Objet dans la session, il me semble qu'il faudrait une alternative.
    Peut être comme ceci : (à faire dans toutes les pages, au moins celles réclament Obj)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    require_once("class/objet.class.php");
    session_start();
     
    if (!isset($_SESSION['obj']) || !is_object($_SESSION['obj'])) {
        $_SESSION['obj'] = new Objet();
    }
     
    // Optionnel, pour que $obj et $_SESSION['obj']
    // soient une même référence
    $obj =& $_SESSION['obj'];
    A essayer

  3. #3
    Membre averti Avatar de sayari.dev
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 142
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    1-

    En général, pour pouvoir stocker un objet dans ton $_SESSION, il faut le "linéariser" avec serialize();


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['obj'] = serialize($obj)
    et pour la récupération

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $obj = unserialize($_SESSION['obj'])
    2-

    Pour ton cas ici

    Mon objet n'a qu'une propriété ($connexion), qui est un objet PDO.
    Je ne vois pas utile de sauvegarder ton objet à travers la session. Si malgrès tu veux le stocker dans toon $_SESSION, pense à implémenter les méthodes magiques __sleep et __wakeup pour la classe Objet.

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par sayari.dev
    En général, pour pouvoir stocker un objet dans ton $_SESSION, il faut le "linéariser" avec serialize();
    Tu en ait sûr de ça ?

    Pour exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class UneClasse {
        public $uneVar = 'Classe : ';
     
        public function afficher() {
            echo $this->uneVar.__METHOD__.'<br />';
        }
    }
     
     
    if (!isset($_SESSION['UneClasse']) || !is_object($_SESSION['UneClasse'])) {
        $_SESSION['UneClasse'] = new UneClasse();
    }
    $_SESSION['UneClasse']->afficher();
    Ceci affiche :
    Classe : UneClasse::afficher
    sans avoir à sérialiser/désérialiser quoi que ce soit.

    Il me semble qu'au niveau des session c'est une exception, Php le fait automatiquement, il faut juste le synoptique de la classe (ce qui est aussi nécessaire quant on sérialise/désérialise).
    D'ailleurs, si Php ne le faisait pas, que l'on stock un Objet ou pas, il aurait été nécessaire de le faire, car c'est une chaine sérialisée qui se trouve dans les fichiers de sessions.

    Il me semble que c'est à l'époque de Php4 ou c'était nécessaire, non ?

    Enfin, tout ça sauf erreur.

  5. #5
    Membre averti Avatar de sayari.dev
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 142
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Tu en ait sûr de ça ?

    Pour exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class UneClasse {
        public $uneVar = 'Classe : ';
     
        public function afficher() {
            echo $this->uneVar.__METHOD__.'<br />';
        }
    }
     
     
    if (!isset($_SESSION['UneClasse']) || !is_object($_SESSION['UneClasse'])) {
        $_SESSION['UneClasse'] = new UneClasse();
    }
    $_SESSION['UneClasse']->afficher();
    Ceci affiche :
    Classe : UneClasse::afficher
    Je croyais que j'étais sûr

    Réunionnais

  6. #6
    Membre averti Avatar de sayari.dev
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 142
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Mais ça n'a pas d'valeur, ça ne vaut pas un Zend Certified

    Par contre, pour les trous d'mémoires, on est tous certifiés d'en avoir.

  7. #7
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par sayari.dev
    Vu que la mauvaise blague n'est pas partagée ou incomprise, alors je l'ai supprimée.
    Reste à en faire autant, et il n'aura plus de question à se poser.

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2007
    Messages : 78
    Points : 65
    Points
    65
    Par défaut
    Wah !!!
    Je m'attendais pas à tant de réponses ...

    Bon, pour la sérialization, j'avais déjà testé sans meilleur résultat.

    Pour l'instance PDO contenue dans mon objet, j'avais aussi pensé à implémenté __sleep et __wakeup. Dans __sleep, je détruisais ma connexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function __sleep(){
        $this->connexion = null;
    }
    ,ou connexion est mon instance de PDO.

    Et inversement, dans __wakeup(), je ré-instanciais ma connexion.

    Ma classe à besoin d'une connexion à ma base de donnée. Cette connexion est établie dans le constructeur de mon objet. Et l'idée c'est de ne pas avoir à ré-établir cette connexion à chaque fois que l'utilisateur change de page.

    Je débute en PHP objet, et concrètement, mon gros problème s'est de faire perdurais les instances de mes objet, à travers mes différentes pages, sans devoir toujours les ré-instancié.

  9. #9
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Ma classe à besoin d'une connexion à ma base de donnée. Cette connexion est établie dans le constructeur de mon objet. Et l'idée c'est de ne pas avoir à ré-établir cette connexion à chaque fois que l'utilisateur change de page.
    Avoir une classe qui a besoin de faire une connexion à la Bdd, d'accord, mais de là à se dire qu'on y gagnerait en stockant PDO dans la session plutôt de refaire la connexion, je ne suis pas convaincu.

    Faire la connexion en PDO c'est : $pdo = new Pdo('bla bla bla');
    Ca ne doit pas prendre plus d'1 millième de seconde.

    Par contre, stocker tout l'Objet, déjà ça occupe de la mémoire, le sérialiser puis désérialiser, ça prend du temps.

    Si on pèse les 2 dans la balance, je serait curieux de savoir quel coté ça bascule.


    Puis avoir un Objet PDO dans la session, c'est une chose, mais est ce que la connexion (physiquement parlant) est conservée, persistante, jusqu'à ce que la personne fasse une nouvelle demande de contenu (ou page), soit 1, 20 voir 20 minutes après ?
    Personnellement j'en doute, je pense que MySQL ne conservera plus aucune référence de cet Objet, la détruira dès que le script Php se terminera.
    En somme, il faudra à nouveau établir la connexion, prévoir :
    $pdo = new PDO('blablabla') à chaque fois.

    Enfin, fais des essais.


    Je débute en PHP objet, et concrètement, mon gros problème s'est de faire perdurais les instances de mes objet, à travers mes différentes pages, sans devoir toujours les ré-instancié.
    Ok, mais PDO est une exception à mon sens à cause de cette liaison/connexion.
    Puis je ne suis pas certain que les sessions soient adaptés à ce que tu souhaite.
    Faut peut être prospecter du coté de APC (Alternative Php Cache) ou Memcache.

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2007
    Messages : 78
    Points : 65
    Points
    65
    Par défaut
    Ok, merci pour tous ces renseignements, j'en prend bonne note . C'est en faisant des erreurs qu'on apprend .

    Mais une question me reste. Pour transmettre les instances des mes objet à travers mes pages, quel est le meilleur moyen? Étant donnée que les variables de session perdure tant que l'utilisateur navigue sur mon site, il me semblais que c'était une bonne solution ...

  11. #11
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Pour transmettre les instances des mes objet à travers mes pages, quel est le meilleur moyen? Étant donnée que les variables de session perdure tant que l'utilisateur navigue sur mon site, il me semblais que c'était une bonne solution ...
    Le problème que tu évoque c'est que peut être tu prévois de stocker beaucoup trop d'information dans des Objets, alors que les stocker dans une Bdd par exemple serait peut être plus judicieux.

    Ne serait stocké dans les sessions que l'essentiel, comme :
    un user_id, des article_id visités, etc, etc, que sais-je, mais pas la date de naissance, ni l'adresse, ni le nom, titre, contenu des articles, etc ...

    Ensuite, on ne fait que (re)générer uniquement ce qui est demandé.
    Si on demande de générer les 10 derniers articles avec leur titre, nom et contenu, on voit ici qu'il n'est pas utile de stocker les 20 ou 30 derniers.

    Après vient le problème du temps qu'il faudra à générer le contenu.
    Mais ça c'est un autre problème, qui d'ailleurs peut être compensé par l'utilisation de cache, ou autre.

    Mais si on part du principe de stocker un max d'information sous le coude pour le générer plus rapidement, je dirais que le contexte ne s'y prête pas.
    A moins d'avoir de gros moyens (gros serveur, puissant, etc ...).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR ?] gerer les propriétés des objets via les formules?
    Par Flamby38 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 25/06/2008, 17h01
  2. Réponses: 2
    Dernier message: 31/10/2007, 14h26
  3. Changer les droits sur un objet via une requete
    Par gg72160 dans le forum Sécurité
    Réponses: 1
    Dernier message: 10/06/2006, 21h14
  4. Accès aux bases de données via les objets de Borland (Bdpxx)
    Par agodinasandrien dans le forum Delphi .NET
    Réponses: 9
    Dernier message: 26/09/2005, 14h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo