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 [21/11/2021 20:20] – Ajout de la comparaison avec le Java. alouradou | 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: | ||