Partage
  • Partager sur Facebook
  • Partager sur Twitter

MOOC Programmez en orienté objet en PHP

    20 juin 2018 à 21:21:54

    Bonjour,

    j'ai fait le chapitre sur l'API de réflexivité et j'ai du mal à voir à quoi ça peut servir concrètement. Est-ce que vous pouvez me donner quelques exemples concrets dans des situations réelles ?

    Merci.

    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2018 à 23:38:22

      me_moi a écrit:

      Bonjour,

      j'ai fait le chapitre sur l'API de réflexivité et j'ai du mal à voir à quoi ça peut servir concrètement. Est-ce que vous pouvez me donner quelques exemples concrets dans des situations réelles ?

      Merci.



      • Partager sur Facebook
      • Partager sur Twitter
      Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
        10 juillet 2018 à 10:04:33

        Bonjour,

        dans le chapitre sur les interfaces, à l'implémentation de SeekableIterator, la méthode seek est définie comme ceci :

        /**
           * Déplace le curseur interne.
           */
          public function seek($position)
          {
            $anciennePosition = $this->position;
            $this->position = $position;
            
            if (!$this->valid())
            {
              trigger_error('La position spécifiée n\'est pas valide', E_USER_WARNING);
              $this->position = $anciennePosition;
            }
          }

        Est-ce qu'il aurait été possible de faire comme ça ?

        /**
           * Déplace le curseur interne.
           */
          public function seek($position)
          {
            if ($this->valid())
            {
              $this->position = $position;
            }
          }
        • Partager sur Facebook
        • Partager sur Twitter
          10 juillet 2018 à 16:40:35

          Bonjour me_moi, ton code va fonctionner si et seulement si la position est valide ce qui n'est pas toujours le cas.

          -
          Edité par StéphaneteAnguilet 10 juillet 2018 à 16:41:17

          • Partager sur Facebook
          • Partager sur Twitter
          Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
            10 juillet 2018 à 19:01:14

            Avec mon code, si la position n'est pas valide, il ne se passe rien.

            Avec le code du cours, en réaffecte l'ancienne valeur si la nouvelle n'est pas valide et on declenche une erreur.

            À part l'erreur qui est declenchee, est-ce que les deux codes ne reviennent pas au même ?

            • Partager sur Facebook
            • Partager sur Twitter
              12 juillet 2018 à 14:39:08

              me_moi a écrit:

              Avec mon code, si la position n'est pas valide, il ne se passe rien.

              Avec le code du cours, en réaffecte l'ancienne valeur si la nouvelle n'est pas valide et on declenche une erreur.

              À part l'erreur qui est declenchee, est-ce que les deux codes ne reviennent pas au même ?


              Justement, c'est pas parce que il n y a pas d'erreur(s) que tout va bien, en fait si on réaffecte à l'ancienne valeur au curseur c'est parce que on sait qu'elle est valide. voici comment ta méthode fonctionne. On passe un $position (un programmeur quelconque) valant -5 par exemple, l'instruction valid() retourne false, ainsi la structure conditionnel n'exécute pas le code entre accolade, ton programme continu tranquille car il n'y a pas d'erreur juste une mauvaise interprétation.
              • Partager sur Facebook
              • Partager sur Twitter
              Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                12 juillet 2018 à 14:48:08

                Bonjour à tous, j'ai un petit soucis / une incompréhension,

                Dans le tp du mini-jeu de combat, dans la classe PersonnageManager il y a cette méthode :

                  public function add(Personnage $perso)

                  {

                    $q = $this->_db->prepare('INSERT INTO personnages(nom) VALUES(:nom)');

                    $q->bindValue(':nom', $perso->nom());

                    $q->execute();

                    $perso->hydrate([

                      'id' => $this->_db->lastInsertId(),

                      'degats' => 0,

                    ]);

                  }

                L'hydratation de l'objet doit être réalisé avant la requete sql non ? sinon la requête insert des valeurs null.

                Le constructeur de mon objet et la méthode hydrate (tout deux dans ma classe Personnage) :

                  public function __construct(array $donnees) 

                  {

                    $this->hydrate($donnees);

                  }

                  public function hydrate(array $donnees)

                  {

                    foreach ($donnees as $key => $value)

                    {

                      $method = 'set'.ucfirst($key);

                      if (method_exists($this, $method))

                      {

                        $this->$method($value);

                      }

                    }

                  }

                Mon problème est que je n'arrive pas à trouver une solution pour avoir mes données en bdd mais aussi sur mon objet après l'hydratation.

                A part refaire une requête après mais cela ne me semble pas être la bonne solution ( à moins que l'auteur sous entend que l'on doit utiliser une requête update après avec sa fonction update pour mettre à jour la bdd ?)

                Via un var dump j'ai bien les attributs complété mais pas en bdd.

                Si quelques choses ne vous semble pas clair n'hésitez pas,

                Merci beaucoup

                -
                Edité par Bekline 12 juillet 2018 à 14:49:17

                • Partager sur Facebook
                • Partager sur Twitter
                  12 juillet 2018 à 15:23:28

                  Bekline, je vois ce vous voulez dire la méthode add, prend une instance de l'objet Personnage, de ce fait il possède déjà des valeurs, il ajoute justement ces valeurs en DB, hydratation ici est juste une opération de mise en ordre id avec publicstringPDO::lastInsertId ([ string $name = NULL ] ), dégât à 0. 
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                    12 juillet 2018 à 15:44:33

                    Autrement dit ma méthode add ne sert qu'à ajouter l'id à la bdd ? 

                    et j'affecte avec uniquement avec mon paramètre array $donnees ?

                      public function __construct(array $donnees) // 

                      {

                        $this->hydrate($donnees);

                      }

                    ou alors j hydrate deux fois une pour l'id après la requete pour utiliser la fonction last id et une autre pour les caractéristiques?

                    Merci beaucoup de votre réponse :)

                    -
                    Edité par Bekline 12 juillet 2018 à 21:00:27

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juillet 2018 à 19:34:29 - Message modéré pour le motif suivant : Non respect des règles du forum et des cours


                        14 juillet 2018 à 4:04:40

                        Bekline a écrit:

                        Autrement dit ma méthode add ne sert qu'à ajouter l'id à la bdd ? 

                        et j'affecte avec uniquement avec mon paramètre array $donnees ?

                          public function __construct(array $donnees) // 

                          {

                            $this->hydrate($donnees);

                          }

                        ou alors j hydrate deux fois une pour l'id après la requete pour utiliser la fonction last id et une autre pour les caractéristiques?

                        Merci beaucoup de votre réponse :)

                        Désolé du retard, Bekline. En fait, on a juste un objet personnage de créé mais pas encore sauvegardé en DB, avec la méthode add, on l'ajoute en DataBase avec la commande INSERT INTO, rappelez-vous que les tuples/champs id est en auto-incrément et degats à DEFAULT 0, de ce fait le personnage courant est par la suite hydraté donc on lui rajoute des informations à savoir 'id' avec lastInsertId qui retourne le dernier id généré et degats à 0. Ainsi l'objet personnage est à jour, car au début il ne possédait que son nom, et n'était pas en DataBase. J’espère vous avoir aidé. 

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                          14 juillet 2018 à 21:45:42

                          Oui j'ai retravaillé ça et vos explications confirment mon nouveau raisonemment merci beaucoup de votre aide c'est toujours très appréciable d'avoir du soutien de personne plus expérimenté 

                          Merci encore 

                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 juillet 2018 à 10:50:12

                            Bonjour,

                            j'ai fait le chapitre sur l'API de réflexivité et j'ai du mal à voir à quoi ça peut servir concrètement. Est-ce que vous pouvez me donner quelques exemples concrets dans des situations réelles ?

                            Dans le chapitre sur les générateurs, les valeurs "Un", "Deux", "Trois" et "Quatre" sont affichées à l'envers, de droite à gauche (nU, xueD, siorT, ertauQ). Quelle partie du code cause ce comportement ?

                            Merci.

                            -
                            Edité par me_moi 15 juillet 2018 à 10:51:36

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 juillet 2018 à 8:21:13

                              Bonjour,

                              j'ai fait le chapitre sur l'API de réflexivité et j'ai du mal à voir à quoi ça peut servir concrètement. Est-ce que vous pouvez me donner quelques exemples concrets dans des situations réelles ?

                              Dans le chapitre sur les générateurs, les valeurs "Un", "Deux", "Trois" et "Quatre" sont affichées à l'envers, de droite à gauche (nU, xueD, siorT, ertauQ). Quelle partie du code cause ce comportement ?

                              est-ce que quelqu'un a une idée ?

                              Merci.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 juillet 2018 à 7:18:44

                                Bonjour me_moi, l'API de réflexibilité ou introspection est utile par exemple pour instancier une classe automatiquement, par exemple en Java on l'utilise souvent pour découvrir de façon dynamique des informations relatives à une classe ou à un objet, mais ce genre de système est généralement mit au point par des socles de travail PHP (framework PHP), notamment Laravel, Symfony, Sylex, etc... lorsque vous utiliserez ces socles de travail vous vous direz un jour "mdr c'est donc ça cette foutue réflexibilité), en gros elle permet d'automatiser les choses, de faire en sorte que PHP ou Java sait ce que votre classe est. Exemple: soit la méthode suivant public function test(Manager){ //Opérations avec Manager} de Myclass. Avec l'introspection Mysclass ne contiendra pas nécessairement un new Manager, quelque part et s'aura automatique qu'il faudra injecter une instance de Manager. Fini les $obj = new Class($params), PHP s'aura quoi faire. En suite pour les générateurs c'est très simple l'auteur utilise string strrev (string $string), cette fonction inverse une chaîne de caractère. J’espère vous avoir aidé.

                                -
                                Edité par StéphaneteAnguilet 19 juillet 2018 à 19:10:58

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                                  22 juillet 2018 à 0:55:07

                                  moi en tout cas ça m'a aidé xD merci
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Google répond à tout, PHP Manual sait (presque) tout, StackOverflow envisage tout !
                                    22 juillet 2018 à 13:37:13

                                    Caroline B. a écrit:

                                    moi en tout cas ça m'a aidé xD merci


                                    Alors je suis satisfait, merci.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                                      23 juillet 2018 à 11:46:49

                                      Merci pour ta réponse.

                                      Ce que j'avais compris de l'API de réflexivité (et des annotations), c'est qu'on peut obtenir des informations sur une classe. Est-ce que j'ai mal compris l'intérêt de l'API de réflexivité ?

                                      Si j'ai bien compris, avec l'API de réflexivité, il n y a pas besoin d'instancier une classe ?

                                      Pourtant, dans tout le chapitre, il y a sans arrêt des

                                      $objet = new Class;

                                      Pour les chapitre sur les générateurs, je viens de réviser le chapitre (je révise chaque chapitre), et la première fois, je n'avais pas vraiment fait attention à la fonction strrev() car j'étais trop occupé à comprendre les générateurs, c'est lors de la révision que je suis encore en train de faire au moment où j'écris ces lignes que je m'en suis rendu compte et avec un petit tour côté la doc PHP. Autant pour moi.

                                      Merci.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        24 juillet 2018 à 20:27:44

                                        Bonsoir, me_moi, vous ne comprenez pas l’intérêt? Il y en a pourtant! Automatiser les choses ce n'est pas un intérêt, faire en sorte que votre script sait sur quoi il agit ce n'est pas un intérêt? Supposant que vous avez un projet conséquent et que vous n y touchez pas un moment il y a des choses qui vont vous échapper lorsque vous y reviendrez! Alors si vous avez décidé d’être organisé, l'API de réflexibilité peut être utile car si votre script sait il pourra vous apprendre/rappeler que telle ou telle méthode appartient, à telle classe, et que la méthode et même d'en faire une liste. Supposant que vous avez une méthode delete dans deux classes différentes, admettons model et cache, il peut vous arriver de vouloir savoir de laquelle il s'agit. "Si j'ai bien compris, avec l'API de réflexivité, il n y a pas besoin d'instancier une classe", ce n'est pas cela, avec l'API de réflexibilité on peut faire en sorte de ne pas avoir besoin d'instancier une classe.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                                          26 juillet 2018 à 11:35:40

                                          Bonjour,

                                          J'ai un problème avec les caractères spéciaux, quelqu'un peut m'aider. 

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            29 juillet 2018 à 18:46:01

                                            Hello,

                                            As-tu regardé ici ? https://openclassrooms.com/forum/sujet/foire-aux-questions-php

                                            Par ailleurs, si tu n'y trouve pas de solution et que ta question n'est pas en lien avec le cours sur la POO, pourrais-tu la clarifier et la poster en dehors de ce sujet s'il te plait ? (sur le forum plus général PHP) :) 

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Google répond à tout, PHP Manual sait (presque) tout, StackOverflow envisage tout !
                                              31 juillet 2018 à 17:41:40

                                              Bonjour à tous,

                                              J'ai un souci depuis un moment avec mon serveur Mysql. En fait, quand j'essai de me connecter en utilisant PDO il me renvoie l'erreur suivante :

                                              SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES)

                                              Par contre quand j'utilise Mysqli pour me connecter il n'y a pas de problème.

                                              Voici ma config du fichier config.inc.php

                                              /* Servers configuration */
                                              $i = 0;
                                              
                                              $cfg['blowfish_secret'] = 'h]C+{nqW$omNoTIkCwC$%z-LTcy%p6_j$|$Wv[mwngi~|e'; //What you want
                                              
                                              /* Server: localhost [1] */
                                              $i++;
                                              $cfg['Servers'][$i]['verbose'] = 'Local Databases';
                                              $cfg['Servers'][$i]['host'] = 'localhost'; //127.0.0.1
                                              $cfg['Servers'][$i]['extension'] = 'mysqli';
                                              //$cfg['Servers'][$i]['extension'] = 'pdo'; // A verifier
                                              $cfg['Servers'][$i]['auth_type'] = 'http'; //cookie
                                              $cfg['Servers'][$i]['user'] = 'root';
                                              $cfg['Servers'][$i]['password'] = 'bibi';
                                              
                                              // Hidden databases in PhpMyAdmin left panel
                                              //$cfg['Servers'][$i]['hide_db'] = '(information_schema|mysql|performance_schema|sys)';
                                              
                                              // Allow connection without password
                                              $cfg['Servers'][$i]['AllowNoPassword'] = true;
                                              //$cfg['Servers'][$i]['AllowNoPassword'] = false;
                                              
                                              // Suppress Warning about pmadb tables
                                              $cfg['PmaNoRelation_DisableWarning'] = true;
                                              
                                              // To have PRIMARY & INDEX in table structure export
                                              //$cfg['Export']['sql_drop_table'] = true;
                                              //$cfg['Export']['sql_if_not_exists'] = true;
                                              
                                              $cfg['MySQLManualBase'] = 'http://dev.mysql.com/doc/refman/5.7/en/';
                                              /* End of servers configuration */
                                              

                                              Et mon fichier de connexion

                                              define("MYHOST","localhost");
                                              define("MYBASE","bdlogidrome");
                                              define("MYUSER","root");
                                              define("MYPASS","bibi");
                                              define("DSN1","mysql:host=localhost;dbname=bdlogidrome;charset=utf8");
                                              
                                              try{
                                              	$con=new PDO(DSN1,MYUSER,MYPASS);
                                              	 $con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
                                              	}catch(PDOException $e){
                                              	echo("Erreur de connexion ".$e->getMessage());
                                              	die();
                                              }
                                              

                                              Je signale que j'ai defini le meme mot de passe à l'utilisateur root sur le serveur.

                                              Et aussi que j'ai activé l'extension php_pdo_mysql.

                                              Merci de m'aider. J'ai fouillé un peu partout sans solution.

                                              Bibibengo


                                              -
                                              Edité par bibibengo 31 juillet 2018 à 17:51:20

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              L'effort c'est ce qui nous coûte. N'ayons donc pas peur d'en faire si nous voulons avancer dans la vie !
                                                31 juillet 2018 à 22:07:45

                                                bibibengo, Bonsoir j'ai des questions. Vous utilisez wamp? Quel est votre version? Avez vous modifiez le fichier config.inc.php? Si oui à quel niveau?

                                                Je crois que l'erreur est autre part, car en vérité config.inc.php, a seulement besoin de contenir les paramètres dont vous voudriez changer la valeur par défaut dans le fichierlibraries/config.default.php.

                                                -
                                                Edité par StéphaneteAnguilet 31 juillet 2018 à 22:23:46

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Le but est d’être meilleur que hier, en apprenant chaque jour quelque chose de nouveau.
                                                  8 août 2018 à 2:25:43

                                                  Je viens de galérer deux heures pour comprendre ce qui faisait que le code donné dans le cours Partie 1, Chapitre 4 (bases de données) marchait pas pour l'insertion d'un nouveau personnage.

                                                  Alors oui, ça a été dit x fois, le premier bug c'est qu'il faut ajouter la fonction __construct dans la classe Personnage et activer la fonction hydrate.

                                                    public function __construct(array $donnees)
                                                    {
                                                      $this->hydrate($donnees); 
                                                    }

                                                  Mais après ça autant le personnage était créé, autant il voulait pas s'ajouter dans la base de données (qui pourtant était bien connectée). Il se trouve que les conditions mises dans les setters de la fonction personnage n'autorisent pas de mettre une expérience en-dessous de 1.

                                                  Le prof nous indique de tester la fonction avec le personnage suivant : 

                                                  $perso = new Personnage([
                                                    'nom' => 'Victor',
                                                    'forcePerso' => 5,
                                                    'degats' => 0,
                                                    'niveau' => 1,
                                                    'experience' => 0
                                                  ]);

                                                  Or vu que l'expérience est à 0 donc inférieure à 1 elle n'est pas enregistrée dans l'objet $perso à sa création, et $perso->experience() est NULL. Du coup, ça fait bugger tout le code SQL lors de l'ajout à la base de données parce-qu'on a une valeur NULL que SQL peut pas gérer. J'ai changé à 2 pour tester et immédiatement le code marchait et c'était ajouté à la BDD.

                                                  Donc si quelqu'un a le même bug, voilà pourquoi quand on teste le code du prof, ça ne marche pas.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    9 août 2018 à 18:41:11

                                                    zerochan a écrit:

                                                    Bonjour à tous!

                                                    Je veux créer une classe générique qui contient presque toutes les méthodes pour la gestion d'une db mais j'ai un probleme au niveau de l'insertion, C'est tout bête mais je ne sais pas quoi mettre à la place de XX  :euh: , merci d'avance 

                                                    <?php
                                                     class DAO{
                                                    	
                                                    	protected $db;
                                                    	
                                                    	public function __construct($db){
                                                    		$this->setDb($db);
                                                    	}
                                                    	public function setDb($db){
                                                    		$this->db=$db;
                                                    	}
                                                    	
                                                    	public function insertion($myObj){
                                                    		$nom=$myObj->getNomTable();
                                                    		$data=array();
                                                    		$sql = sprintf('DESCRIBE %s',$nom);
                                                    		$rep = $this->db->prepare($sql);
                                                    		$rep->execute();
                                                    		
                                                    		foreach($rep->fetchAll(PDO::FETCH_ASSOC) as $rows){
                                                    			$data[]=$rows['Field'];
                                                    		}
                                                    		echo '<pre>';
                                                    		print_r($data);
                                                    		foreach($data as $key=>$att){
                                                    				$method ='get'.ucfirst($att);
                                                    				if(method_exists($myObj,$method)){
                                                    					$sql="INSERT INTO mygestion.".$nom."SET".$att."='".XX;
                                                    					$req1=$this->db->prepare($sql);
                                                    					$req1->bindValue(XX,$myObj->$method());
                                                    					$req1->execute();
                                                    				}
                                                    		}
                                                    		
                                                    		
                                                    	}
                                                    
                                                    }

                                                    svp si peux-tu donner le code des fonction d'ajoute, modifier et supprimer, j'ai travaille sur une application et je doit terminer le travaille dans le plus temps possible merci de m'aide
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      12 août 2018 à 15:18:36

                                                      Bonjour,

                                                      Dans la partie du projet monsupersite, il y a une requête concaténée dont la clause LIMIT est écrite dans un IF, ce que je trouve pas très propre. Est-ce qu'il n y a pas une meilleure manière d'écrire la même requête en use seule fois et de faire le test du if ailleurs, avant ou après ?

                                                      Merci pour votre aide.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        25 août 2018 à 18:41:56

                                                        Bonjour,

                                                        En l'absence de réponse je me réponds à moi-même. Voici le résultat de mes recherches...

                                                        En fait dans la classe NewsManagerPDO.php il y a un appel à PDO::FETCH_CLASS. "C'est à dire que nous voulons que PDO nous retourne les résultats sous forme d'instances de notre classe News,"

                                                        Nous avons donc le code suivant :

                                                        $requete->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, '\Entity\News');
                                                        
                                                        $listeNews = $requete->fetchAll();

                                                        A partir de là les modifications du contenu (le troncage à 200 caractères) via   $news->setContenu($debut) qui modifie le champ, attribut "contenu" de la classe News se répercutent immédiatement dans listeNews qui est une instance de News (comme définie plus haut)...

                                                        En vous remerciant.

                                                        -
                                                        Edité par chris79 26 août 2018 à 15:15:30

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          27 août 2018 à 17:50:21

                                                          Bonjour,

                                                          Petite question sur la construction de la bibliothèque dans la dernière partie. En fait, il faut créer une vue par action dans le dossier View ? Merci d'avance pour votre réponse

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            27 août 2018 à 17:54:01

                                                            D'accord, j'étais pas sur d'avoir bien compris. Merci :)
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            MOOC Programmez en orienté objet en PHP

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            • Editeur
                                                            • Markdown