Partage
  • Partager sur Facebook
  • Partager sur Twitter

POO , Sérialisation -> Fatal error

Sujet résolu
    17 février 2007 à 19:45:17

    Bonjour à tous, j'ai décidé d'apprendre la POO en tombant sur un site cet après midi, je suis le tuto et j'arrive à la partie sur la sérialisation.
    Voici le tuto en question http://www.phpdebutant.org/article44.php (Le I)
    Je fais le code, et là à ma grande surprise php me dit :
    Fatal error: Call to a member function afficherGenreMusical() on a non-object in C:\Documents and Settings\Kevin\Bureau\EvoluPix\Site\genre.php on line 15

    Donc je pense tout de suite à une erreur de ma part, je vérifie, et je fini par copier coller carrément le code du tuto. Mais là ... ça marche toujours pas o_O !!
    Donc je m'en remets à vous. Je ne sais pas du tout de quoi ça peut venir, ma version de PHP ? J'utilise WAMP 1.6.6 et je n'ai jamais eu de problème avec.
    Donc voilà, une idée ??

    Merci de votre aide !!


    • Partager sur Facebook
    • Partager sur Twitter
      17 février 2007 à 20:21:08

      C'est quoi la ligne 15 de ton script ?
      • Partager sur Facebook
      • Partager sur Twitter
        17 février 2007 à 20:57:10

        <?php

         include ("CompactDisc.class.php");

         include ("CDAudio.class.php");



         $param = stripslashes(urldecode($var));

         $cdDeSerial = unserialize ($param);



         echo $cdDeSerial->afficherGenreMusical(); // __ Ligne 15 ici __ //

        ?>


        Mais je répete c'est exactement les même code que le lien que j'ai posté (http://www.phpdebutant.org/article44.php)

        Merci !
        • Partager sur Facebook
        • Partager sur Twitter
          17 février 2007 à 21:43:23

          Il n'y a aucune construction d'objet il me semble du type "$var = new taClass(param)"
          • Partager sur Facebook
          • Partager sur Twitter
            17 février 2007 à 22:01:44

            Je pense quen fait que c'est normal parce que on veux pas faire une nouvelle classe mais transmettre l'autre pour garder les valeurs qu'elle avait. Mais je vois pas pourquoi j'ai cette fatale error qui se met :@
            • Partager sur Facebook
            • Partager sur Twitter
              17 février 2007 à 22:16:04

              Une classe est une sorte de moule avec des méthodes (fonctions en gros) prédéfinies pour manipuler des objets.
              Il faut donc avoir un constructeur d'objet dans le moule qui initialisera les parametres de l'objet.
              Dans ton programme principal tu appellera ton moule pour définir un objet de la manière suivante:
              $monobjet = new maclasse(paramentres).

              je te conseille de suivre ce tuto bien expliqué:
              http://hachesse.developpez.com/objetphp/
              • Partager sur Facebook
              • Partager sur Twitter
                17 février 2007 à 22:23:31

                Ok, je vais aller voir ton tuto qui m'a l'air très bien expliqué ! Merci
                Sinon le probleme c'est que je crée mes méthodes dans les fichiers qui sont inclus, je crée mon objet $cd mais après quand je le sérialise et que je le transmet à l'autre page, il est pas reconnu en tant qu'objet et donc quand je veux utiliser ma méthode il me dit que c'est pas un objet et après fatal error ^^

                merci !


                PS : sinon j'en profite au lieu de créer un autre topic, on dit dans ton tuto et le mien que le constructeur de classe est une fonction qui porte le même nom que la classe elle même. Cependant j'ai déjà vu qu'on pouvait utiliser un fonction appellée __construct() (ici par ex : tuto ),
                {avec un peu de pub au passage sur les templates pour mon autre probleme déjà perdu dans les profondeurs du forum : ici }.
                Alors que doit-on utiliser, sachant que je code en PHP 5 ??

                Merci de vos réponses !
                • Partager sur Facebook
                • Partager sur Twitter
                  17 février 2007 à 22:25:42

                  Ah d'accord donc tu avais déja créé ton objet!!
                  Je me suis basé sur le petit bout de code en pensant que tu n'avais pas tout compris je suis désolé :D
                  Tu pourrais pas mettre le code entier?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 février 2007 à 22:25:47

                    Je pratique la sérialisation pour passer les classes en session de temps en temps.

                    Dans ton code, à quoi correspond la variable $var à la troisième ligne de code ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 février 2007 à 22:41:56

                      Bon je vais remettre les codes ici, ce sera plus simple je crois.

                      CompactDisc.class.php
                      <?php

                      class CompactDisc
                      {

                        var $titre, $dateAchat ;

                        function afficherTitre()
                        {
                          echo "<br />Le titre est : ".$this->titre ;
                        }

                        function afficherDateAchat()
                        {
                          echo "<br />CD acheté le: ".$this->dateAchat ;
                        }

                       }

                      ?>



                      CDAudio.class.php
                      <?php

                      class CDAudio extends CompactDisc
                      {

                        var $genreMusical ;

                        function afficherGenreMusical()
                        {
                          echo "<br />Le genre musical est : ".$this->genreMusical ;
                        }

                      }

                      ?>


                      index.php
                      <?php

                        include ("CompactDisc.class.php") ;
                        include ("CDAudio.class.php") ;

                        $cd = new CDAudio() ;
                        $cd->titre = "Rock'n PHP" ;
                        $cd->dateAchat = "25/12/2001" ;
                        $cd->genreMusical = "Rock" ;

                        $cdSerial = serialize($cd) ;
                        $param = urlencode($cdSerial) ;

                        echo "<a href='genre.php?var=$param'>Afficher le genre</a>" ;

                      ?>


                      genre.php
                      <?php

                        include ("CompactDisc.class.php") ;
                        include ("CDAudio.class.php") ;
                       
                        $param = stripslashes(urldecode($var)) ;
                        $cdDeSerial = unserialize ($param) ;

                         echo $cdDeSerial->afficherGenreMusical() ;

                      ?>



                      Sinon Duael $var correspond à mon objet $cd sérialisé et passé en url.


                      Je remet mon PS d'avant qui a du passer inaperçut :
                      PS : sinon j'en profite au lieu de créer un autre topic, on dit dans ton tuto et le mien que le constructeur de classe est une fonction qui porte le même nom que la classe elle même. Cependant j'ai déjà vu qu'on pouvait utiliser un fonction appellée __construct() (ici par ex : tuto ),
                      {avec un peu de pub au passage sur les templates pour mon autre probleme déjà perdu dans les profondeurs du forum : ici }.
                      Alors que doit-on utiliser, sachant que je code en PHP 5 ??
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 février 2007 à 22:51:23

                        En PHP5 comme dans le futur PHP6 tu peux utiliser le nom de la classe ou __construct c'est au choix. Je préfère personnellement __construct car il est plus cohérent avec tout le reste.

                        Concernant ton problème, je pense que tu ne devrais pas passer ton objet dans l'url parce que la longueur d'une url n'est pas illimitée et qu'il est probable que ton objet soit tronqué.

                        Utilises plutôt les sessions.

                        session_start() au début de ton code
                        $_SESSION['monobjet'] = serialize($nomobjet); pour le passer en session
                        $monobjet = unserialize($_SESSION['monobjet']); pour le récupérer
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 février 2007 à 22:56:48

                          Moi eprsu j'utilise un constructeur portant le meme nom que la classe:

                          $cd = new CDAudio() ;
                          $cd->titre = "Rock'n PHP" ;
                          $cd->dateAchat = "25/12/2001" ;
                          $cd->genreMusical = "Rock" ;

                          Tu peux passez cela dans le constructeur!

                          De plus quand tu fais cd->titre cela sous-entend que tu fais appel à la methode titre or tu n'en a pas.
                          La tu essais de manipuler les variables de ta classe directement à partir de ton "main" alors que le principe de la poo est de faire appel aux méthodes qui manipulent les variables qui sont internes à la classe.

                          Dans ton cas il vaudrait mieux mettre:

                          class CompactDisc
                          {

                            var $titre, $dateAchat ;

                            function afficherTitre()
                            {
                              echo "<br />Le titre est : ".$this->titre ;
                            }

                            function afficherDateAchat()
                            {
                              echo "<br />CD acheté le: ".$this->dateAchat ;
                            }

                           }


                          <?php

                          class CDAudio extends CompactDisc
                          {

                            var $genreMusical ;
                            function CDAudio($titre,$dateAchat,$genreMusical){
                              this->$titre = $titre;
                              this->$dateAchat = $dateAchat;
                              this->genreMusical = genreMusical;
                            }

                            function afficherGenreMusical()
                            {
                              echo "<br />Le genre musical est : ".$this->genreMusical ;
                            }

                          }

                          ?>


                          Pour au final dans ton main faire de cette manière:


                          $cd = new CDAudio(Rock'n PHP,25/12/2001,Rock); //pour créer ton objet cd
                          //renvoi titre:
                          echo '
                          cd->afficherTitre()';
                          //renvoi date
                          echo '
                          cd->afficherDateAchat()';
                          //renvoi genre
                          echo '
                          cd->afficherGenreMusical()';
                           



                          Si je me trompe je suis désolé mais je n'ai pas trop l'habitude de manipuler les objets avec le php ;D
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 février 2007 à 22:58:19

                            C'est bon ça marche nickel avec ta technique des sessions ;) merci beaucoup !

                            Ok, je croyais que ce n'étais pas la même chose mais je préfere aussi __construct je trouve ça plus parlant ^^
                            Sinon je me rapelle plus quand php6 sort mais est ce que tu sais quelles seront les "grands" changements ?? J'ai lu quelques trucs sur les magicquotes qui vont être supprimés mais pas grand chose d'autre...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 février 2007 à 23:01:38

                              Suppression des magic_quoites, du safe mode et du global_registers

                              J'ai pas trop trop lu de trucs au sujet de php6 si ce n'est des trucs super précis alors on verra bien ;)

                              J'aimerais tant qu'ils permettent de surcharger les constructeurs d'une classe en fonction de son nombre d'attributs ...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 février 2007 à 23:02:06

                                @ voldo oui je suis d'accord mais le but de l'exercice était d'utiliser serialize et urlencode pour faire passer l'objet d'une page à une autre, c'est un tuto pour apprendre la poo ^^ merci !!

                                Sinon c'est quand même bizarre, dans le tuto ça avait l'air de bien marcher chez lui.

                                Sinon Duael tu pense qu'il vaut mieux toujours mieux utiliser les sessions que GET pour les ojbets alors ?

                                Moi aussi j'avais lu un truc qui était surtout axé sur les magic quotes, que ça allait engendrer des problème de sécurité, notamment les injections sql mais j'ai pas tout compris ^^
                                Je suis encore un Zéro après tout :p
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  17 février 2007 à 23:06:17

                                  Ok si ca marche tant mieux mais j'ai du mal avec la façon dont tu as écris le code je ne percute pas :D (enfin on ne m'a pas appris à faire comme ca en cours :D)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 février 2007 à 23:07:54

                                    bah en fait je l'aurais pas fait comme ça non plus mais je suivais le tuto parfaitement et quand je me suis rendu compte que meme en copiant le code ça marchait pas je suis venu demander ^^
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      17 février 2007 à 23:12:35

                                      Et bah merci à vous deux de m'avoir aidé !!
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 février 2007 à 0:16:21

                                        Je pense qu'il ne faut jamais utiliser les GET pour passer des données sensibles.

                                        Tu as les sessions à ta disposition alors profites en ! En plus tes pages auront une URL bien plus propre :)
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        POO , Sérialisation -> Fatal error

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown