Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
formations:devweb_5 [13/11/2020 19:00] – [Exercice 1 - Calculette peu performante] mmohamed | formations:devweb_5 [23/11/2021 19:31] (Version actuelle) – [Exercice 1 - Calculette peu performante] mmohamed | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Devweb 105 : Programmation Orientée Objet (POO) ====== | ||
+ | ===== Introduction ===== | ||
+ | |||
+ | En général, vous n'avez jusqu' | ||
+ | |||
+ | Il existe une autre représentation très courante pour programmer appelée la **POO** (ou Programmation Orientée Objet). Lorsque l'on programme en utilisant la POO, tout notre code devient un ensemble d' | ||
+ | |||
+ | Chaque objet est défini selon des caractéristiques et un plan bien précis. En POO, ces informations sont contenues dans ce qu'on appelle des **classes**. | ||
+ | |||
+ | ===== Les classes ===== | ||
+ | |||
+ | Une classe est un ensemble d' | ||
+ | |||
+ | Notre classe serait donc ainsi : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | L'un des avantages de la POO est que l'on peut masquer le code à l' | ||
+ | |||
+ | ==== Créer un classe en PHP ==== | ||
+ | |||
+ | === Syntaxe de Base === | ||
+ | |||
+ | La syntaxe de base est très simple : | ||
+ | |||
+ | <file php> | ||
+ | <?php | ||
+ | class Personnage // Présence du mot-clé class suivi du nom de la classe. | ||
+ | { | ||
+ | // Déclaration des attributs et méthodes ici. | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | === Visibilité d'un attribut ou d'une méthode === | ||
+ | |||
+ | A cela on va ajouter la déclaration des attributs et des méthodes, en les précédant de leur visibilité. Comme je viens de vous l' | ||
+ | |||
+ | Si un attribut/ | ||
+ | |||
+ | Si un attribut/ | ||
+ | |||
+ | Ceci s' | ||
+ | |||
+ | === Création d' | ||
+ | |||
+ | Comme je vous l'ai dit précédemment on va rendre les attribut privés et créer des méthodes publiques grâce auxquelles y accéder : | ||
+ | |||
+ | <file php> | ||
+ | <?php | ||
+ | class Personnage | ||
+ | { | ||
+ | private $_force; | ||
+ | private $_localisation; | ||
+ | private $_experience; | ||
+ | private $_degats; | ||
+ | private $_vie; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Vous pouvez également initialiser les attributs lorsque vous les déclarez : | ||
+ | |||
+ | <file php> | ||
+ | <?php | ||
+ | class Personnage | ||
+ | { | ||
+ | private $_force = 50; // La force du personnage, par défaut à 50. | ||
+ | private $_localisation = ' | ||
+ | private $_experience = 1; // Son expérience, | ||
+ | private $_degats = 0; // Ses dégâts, par défaut à 0. | ||
+ | private $_vie = 100; // Ses points de vie, par défaut à 100. | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | Et son équivalent en **Java**, pour ceux qui y ont déjà touché en cours d' | ||
+ | <file java> | ||
+ | package com.devweb105; | ||
+ | |||
+ | class Personnage { | ||
+ | private int force = 50; | ||
+ | private String localisation = “Lyon”; | ||
+ | private int experience = 1; | ||
+ | private int degat = 0; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | === Création des méthodes === | ||
+ | |||
+ | Comme je vous l'ai dit précédemment on va rendre les méthodes publiques afin d’accéder aux attributs, mais aussi de donner des actions aux Personnages : | ||
+ | |||
+ | <file php> | ||
+ | <?php | ||
+ | class Personnage | ||
+ | { | ||
+ | private $_force; | ||
+ | private $_localisation; | ||
+ | private $_experience; | ||
+ | private $_degats; | ||
+ | private $_vie; | ||
+ | | ||
+ | | ||
+ | public function deplacer($lieu) // Une méthode qui déplacera le personnage (modifiera sa localisation). | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | | ||
+ | public function frapper($personnage) // Une méthode qui frappera un personnage (suivant la force qu'il a). | ||
+ | { | ||
+ | $personnage-> | ||
+ | } | ||
+ | | ||
+ | public function gagnerExperience($xp) // Une méthode augmentant l' | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | //+ getters et setters (cf plus tard) | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Utiliser la classe ==== | ||
+ | |||
+ | === Créer un objet === | ||
+ | |||
+ | Syntaxe très simple grâce au mot-clé **new**: | ||
+ | <file php> | ||
+ | <?php | ||
+ | $perso = new Personnage; | ||
+ | </ | ||
+ | |||
+ | Soit, en java | ||
+ | <file java> | ||
+ | Personnage perso = new Personnage; | ||
+ | </ | ||
+ | |||
+ | === Appeler les méthodes de l' | ||
+ | |||
+ | Pour appeler une méthode d'un objet, il va falloir utiliser l' | ||
+ | |||
+ | <file php> | ||
+ | <?php | ||
+ | // Nous créons une classe « Personnage ». | ||
+ | class Personnage | ||
+ | { | ||
+ | private $_force; | ||
+ | private $_localisation; | ||
+ | private $_experience; | ||
+ | private $_degats; | ||
+ | | ||
+ | // Nous déclarons une méthode dont le seul but est d' | ||
+ | public function parler() | ||
+ | { | ||
+ | echo 'Je suis un personnage !'; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | === Ajouter les getters et les setters ainsi que le constructeur === | ||
+ | |||
+ | Cela donne donc avec les getters et les setters et le constructeur: | ||
+ | |||
+ | <file php> | ||
+ | <?php | ||
+ | class Personnage | ||
+ | { | ||
+ | private $_id; | ||
+ | private $_nom; | ||
+ | private $_forcePerso; | ||
+ | private $_degats; | ||
+ | private $_niveau; | ||
+ | private $_experience; | ||
+ | | ||
+ | // Constructeur | ||
+ | | ||
+ | public function __construct($force, | ||
+ | // Le constructeur de la méthode. Il initialise les attributs dès la création de l’objet. | ||
+ | { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | // Liste des getters | ||
+ | | ||
+ | public function id() | ||
+ | { | ||
+ | return $this-> | ||
+ | } | ||
+ | | ||
+ | public function nom() | ||
+ | { | ||
+ | return $this-> | ||
+ | } | ||
+ | | ||
+ | public function forcePerso() | ||
+ | { | ||
+ | return $this-> | ||
+ | } | ||
+ | | ||
+ | public function degats() | ||
+ | { | ||
+ | return $this-> | ||
+ | } | ||
+ | | ||
+ | public function niveau() | ||
+ | { | ||
+ | return $this-> | ||
+ | } | ||
+ | | ||
+ | public function experience() | ||
+ | { | ||
+ | return $this-> | ||
+ | } | ||
+ | | ||
+ | // Liste des setters | ||
+ | | ||
+ | public function setId($id) | ||
+ | { | ||
+ | // On convertit l' | ||
+ | // Si c'en était déjà un, rien ne changera. | ||
+ | // Sinon, la conversion donnera le nombre 0 (à quelques exceptions près, mais rien d' | ||
+ | $id = (int) $id; | ||
+ | | ||
+ | // On vérifie ensuite si ce nombre est bien strictement positif. | ||
+ | if ($id > 0) | ||
+ | { | ||
+ | // Si c'est le cas, c'est tout bon, on assigne la valeur à l' | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | public function setNom($nom) | ||
+ | { | ||
+ | // On vérifie qu'il s'agit bien d'une chaîne de caractères. | ||
+ | if (is_string($nom)) | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | public function setForcePerso($forcePerso) | ||
+ | { | ||
+ | $forcePerso = (int) $forcePerso; | ||
+ | | ||
+ | if ($forcePerso >= 1 && $forcePerso <= 100) | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | public function setDegats($degats) | ||
+ | { | ||
+ | $degats = (int) $degats; | ||
+ | | ||
+ | if ($degats >= 0 && $degats <= 100) | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | public function setNiveau($niveau) | ||
+ | { | ||
+ | $niveau = (int) $niveau; | ||
+ | | ||
+ | if ($niveau >= 1 && $niveau <= 100) | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | public function setExperience($experience) | ||
+ | { | ||
+ | $experience = (int) $experience; | ||
+ | | ||
+ | if ($experience >= 1 && $experience <= 100) | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | Le même code, en Java donnerait : | ||
+ | |||
+ | Un Getter | ||
+ | <file java> | ||
+ | public String[] getNom() { | ||
+ | return this.nom; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Un Setter | ||
+ | <file java> | ||
+ | public void setNom(String[] nom) { | ||
+ | this.nom = nom; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | === Créer une classe qui hérite d'une autre classe === | ||
+ | Dans cet exemple, on crée une classe Archer qui hérite de la classe personnnage. Ici, les archers ont leurs dégats initialisés à 10. Et leur nom contient le préfixe ' | ||
+ | <file php> | ||
+ | class Archer extends Personnage{ | ||
+ | |||
+ | public function __construct($force, | ||
+ | parent:: | ||
+ | $this-> | ||
+ | | ||
+ | } | ||
+ | |||
+ | public function setNom($cible){ | ||
+ | parent:: | ||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Exercices ===== | ||
+ | |||
+ | ==== Exercice 1 - Calculette peu performante ==== | ||
+ | Cet exercice a pour but de voir si vous avez compris les bases avant de passer à la suite | ||
+ | |||
+ | On vous demande ici de créer une classe MyCalculator toute simple qui prend 2 nombres en arguments. Vous devrez créer une méthode afficher la somme de ces deux nombres, une autre pour afficher la multiplication de ces deux nombres. | ||
+ | |||
+ | On doit donc obtenir quelque chose qui resemble à : | ||
+ | |||
+ | <file php> | ||
+ | <?php | ||
+ | class MyCalculator{ | ||
+ | // Le code de ma classe | ||
+ | } | ||
+ | |||
+ | $mycalc = new MyCalculator(12, | ||
+ | echo $mycalc-> | ||
+ | echo $mycalc-> | ||
+ | ?> | ||
+ | </ | ||
+ | ==== Exercice 2 - Comptes Bancaires ==== | ||
+ | |||
+ | === Introduction === | ||
+ | Le but de cet exercice est de modéliser le système bancaire de manière assez simple. Ce système bancaire fait par vos soins devra comprendre plusieurs banques, permettre à des gens d' | ||
+ | |||
+ | === Exigences === | ||
+ | Votre code devra comprendre au début 3 classes : | ||
+ | * La classe Banque qui contient au moins les attributs nom, nombre de clients; | ||
+ | * La classe Client qui contient au moins les attributs nom, prenom, compte; | ||
+ | * La classe Compte qui contient au moins les attributs client, banque, montant; | ||
+ | |||
+ | On veut que: | ||
+ | - Un client puisse créer un compte dans la banque de son choix | ||
+ | - Un client puisse ajouter ou retirer de l' | ||
+ | - Un client puisse faire un virement à un autre client (Pour simplifier chaque client possède un seul compte à une seule banque) | ||
+ | - Un client ne puisse pas être en négatif | ||
+ | - Lorsqu' | ||
+ | |||
+ | Nous vous suggérons d' | ||
+ | |||
+ | Bonus: | ||
+ | Vous pouvez ajouter une classe Devise et modifier les autres classes pour permettre a des clients d' | ||
+ | |||
+ | === Format attendu === | ||
+ | Pour pouvoir tester facilement votre code, il va falloir respecter certaines notations pour utiliser ce fichier: | ||
+ | <file php test2.php> | ||
+ | <?php | ||
+ | include(" | ||
+ | |||
+ | // Question 1 | ||
+ | $client = new Client(" | ||
+ | $banque = new Banque(" | ||
+ | echo $banque-> | ||
+ | $banque-> | ||
+ | echo $banque-> | ||
+ | $compte = $client-> | ||
+ | echo $client-> | ||
+ | echo "Ce client a " | ||
+ | |||
+ | // Question 2 | ||
+ | $compte-> | ||
+ | echo "Ce client a " | ||
+ | $compte-> | ||
+ | echo "Ce client a " | ||
+ | |||
+ | // Question 3 | ||
+ | $client2 = new Client(" | ||
+ | $banque-> | ||
+ | $client-> | ||
+ | echo $client-> | ||
+ | echo $client2-> | ||
+ | |||
+ | // Question 4 | ||
+ | $compte-> | ||
+ | $client-> | ||
+ | echo $client-> | ||
+ | echo $client2-> | ||
+ | |||
+ | // Question 5 | ||
+ | $banque2 = new Banque(" | ||
+ | $client3 = new Client(" | ||
+ | $banque2-> | ||
+ | $client-> | ||
+ | echo $client-> | ||
+ | echo $client3-> | ||
+ | </ | ||
+ | |||
+ | ==== Exercice 3 - Banque en ligne ==== | ||
+ | |||
+ | Il est nécessaire d' | ||
+ | |||
+ | L' | ||
+ | |||
+ | On veut que : | ||
+ | - La banque en ligne respecte le cahier des charges de la banque classique sans la partie concernant les transactions (cf question 3) | ||
+ | - La banque en ligne doit en plus avoir un attribut ' | ||
+ | - Les transactions réalisées par les clients des banques en ligne n' | ||
+ | |||
+ | Dans cet exercice, il est **<color # | ||
+ | |||
+ | <file php test3.php> | ||
+ | <?php | ||
+ | include(" | ||
+ | |||
+ | // Cette série de test vérifie que l' | ||
+ | // Question 1.1 (Ancienne question 1) | ||
+ | $client = new Client(" | ||
+ | $banque = new BanqueEnLigne(" | ||
+ | echo $banque-> | ||
+ | $banque-> | ||
+ | echo $banque-> | ||
+ | $compte = $client-> | ||
+ | echo $client-> | ||
+ | echo "Ce client a " | ||
+ | |||
+ | // Question 1.2 (Ancienne question 2) | ||
+ | $compte-> | ||
+ | echo "Ce client a " | ||
+ | $compte-> | ||
+ | echo "Ce client a " | ||
+ | |||
+ | // Question 1.3 (Ancienne question 3) | ||
+ | $client2 = new Client(" | ||
+ | $banque-> | ||
+ | $client-> | ||
+ | echo $client-> | ||
+ | echo $client2-> | ||
+ | |||
+ | // Question 1.4 (Ancienne question 4) | ||
+ | $compte-> | ||
+ | $client-> | ||
+ | echo $client-> | ||
+ | echo $client2-> | ||
+ | |||
+ | // Question 2 | ||
+ | $banque-> | ||
+ | echo " | ||
+ | |||
+ | // Question 5.1 | ||
+ | $banque2 = new Banque(" | ||
+ | $client3 = new Client(" | ||
+ | $banque2-> | ||
+ | $client-> | ||
+ | echo $client-> | ||
+ | echo $client3-> | ||
+ | |||
+ | // Question 5.2 (Ancienne question 5) | ||
+ | $client3-> | ||
+ | echo $client-> | ||
+ | echo $client3-> | ||
+ | </ | ||
+ | |||
+ | ===== Compléments ===== | ||
+ | |||
+ | ==== Les héritages ==== | ||
+ | |||
+ | L' | ||
+ | |||
+ | Allez, j' | ||
+ | Notion d' | ||
+ | Définition | ||
+ | |||
+ | Quand on parle d' | ||
+ | |||
+ | Concrètement, | ||
+ | |||
+ | Lorsqu' | ||
+ | |||
+ | Schématiquement, | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Quand est-ce que je sais si telle classe doit hériter d'une autre ? | ||
+ | |||
+ | Soit deux classes A et B. Pour qu'un héritage soit possible, il faut que vous puissiez dire que A est un B. Par exemple, un magicien est un personnage, donc héritage. Un chien est un animal, donc héritage aussi. Bref, vous avez compris le principe. ;) | ||
+ | |||
+ | ==== La Modèle-Vue-Contrôleur (MVC) ==== | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Un des plus célèbres design patterns s' | ||
+ | |||
+ | Le pattern MVC permet de bien organiser son code source. Il va vous aider à savoir quels fichiers créer, mais surtout à définir leur rôle. Le but de MVC est justement de séparer la logique du code en trois parties que l'on retrouve dans des fichiers distincts. | ||
+ | |||
+ | **Modèle** : cette partie gère les données de votre site. Son rôle est d' | ||
+ | |||
+ | **Vue** : cette partie se concentre sur l' | ||
+ | |||
+ | |||
+ | **Contrôleur** : cette partie gère la logique du code qui prend des décisions. C'est en quelque sorte l' | ||
+ | |||
+ | |||
+ | Remarque : Cette forma a été fait à la va-vite et est donc temporairement grandement inspirée de la génialissime et exhaustive formation sur la POO d' | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | Cette formation a été réalisée par [[user: |