La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 285 Cours de Programmation Web : PHP Chapitre 5 : Orienté objet en PHP.

Présentations similaires


Présentation au sujet: "ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 285 Cours de Programmation Web : PHP Chapitre 5 : Orienté objet en PHP."— Transcription de la présentation:

1 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 285 Cours de Programmation Web : PHP Chapitre 5 : Orienté objet en PHP

2 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 286 Chapitre 5: plan 1. PHP est OO (introduction) ‏ 2. La syntaxe « objet » en PHP 3. Les fondamentaux OO en PHP 4. OO avancé en PHP 5. Quelques fonctions en vrac...

3 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 287 1. PHP est OO !!!  Nouveau modèle objet en PHP 5 (versus PHP 4) ‏  Concepts de : classes (abstraites et concrètes), attributs, méthodes, objets...  Principes de : héritage, encapsulation et même... un peu de polymorphisme !!!

4 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 288 2. La syntaxe “objet” en PHP 2.1. La création d'une classe 2.2. L'instantiation d'un objet 2.3. La manipulation d'un objet

5 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 289 2.1. La création d'une classe Mot-clef: class Syntaxe : class { } Peut être défini n'importe où Est un « type », construit par le programmeur class Voiture { // contenu }

6 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 290 2.1. La création d'une classe Les attributs : –Déclarés comme public, private ou protected (PHP 4 : var), mais ne sont pas typés ! –Avec optionnellement une valeur affectée (valeur par défaut)‏ –Constitueront les « données » de l'objet instantié class Voiture { public $marque; public $puissance = "2CV"; }

7 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 291 2.1. La création d'une classe Les méthodes : –Se déclarent comme des fonctions –Une seule méthode du même nom par classe (pas de surcharge !!!)‏ –Peuvent prendre des paramètres, qui peuvent être typés (>< PHP 4). On ne peut que typer des paramètres de fonction par des objets (et pas des types de base). –Peuvent retourner une valeur

8 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 292 class Voiture { function donneConso() { return 30; } class Voiture { function donneConso($nbreKm){ return 30 * $nbreKm; } 2.1. La création d'une classe

9 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 293 2.1. La création d'une classe Les constantes : –Définir des constantes locales à une classe (pas en PHP 4)‏ –Se déclare avec const et sans le symbole $ –Par convention, en majuscule class Voiture { const PROPULSION = 1; const TRACTION = 2; }

10 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 294 2.2. L'instantiation d'un objet Mot-clef: new Syntaxe : $ = new [()]; Un objet est une instance de classe (une variable dont le type est la classe)‏ La classe doit être déclarée, avant d'être instantiée $uneVoiture = new Voiture();

11 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 295 2.2. L'instantiation d'un objet Accéder aux attributs: –Uniquement sur un OBJET créé –Opérateur -> –Sans le symbole $ après l'opérateur -> –Possible d'utiliser des attributs non déclarés class Voiture { public $marque; public $puissance = "2CV"; } $uneVoiture = new Voiture(); echo $uneVoiture->puissance; echo $uneVoiture->attributVide;

12 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 296 2.2. L'instantiation d'un objet Accéder aux méthodes : –Uniquement sur un OBJET créé –Opérateur: -> –Référence à l'objet courant : $this –Valeur de retour directement utilisable (>< PHP4). On peut même avoir: $objet->methode()->methode()‏

13 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 297 2.2. L'instantiation d'un objet <?php class Voiture { public $nbreLitre = 30; function donneConso($nbreKm) { return $this->nbreLitre * $nbreKm; } function donneConsoAnnuelle($nbreKm,$nbreJours=20) { return $this->donneConso($nbreKm) * $nbreJours; } $uneVoiture = new Voiture; echo $uneVoiture->donneConsoAnnuelle(10); ?>

14 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 298 2.2. L'instantiation d'un objet Le constructeur : –Méthode d'initialisation de l'objet –Appelée automatiquement avec le « new » –Peut prendre des paramètres –(constructeur parent pas appelé implicitement)‏ –Deux possibilités : -__construct() (PHP 5 seulement)‏ -Méthode du même nom que la classe (PHP 4, et PHP 5 si pas de __construct())‏

15 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 299 2.2. L'instantiation d'un objet Le destructeur : –Méthode de destruction de l'objet –Appelée automatiquement avec les fonctions unset() ou delete()‏ –(desctructeur parent pas appelé implicitement)‏ –Nommée __destruct()‏

16 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 300 2.2. L'instantiation d'un objet <?php class Date { public $jour; public $mois; public $annee; function __construct($jour,$mois,$annee) { $this->jour = $jour; $this->mois = $mois; $this->annee = $annee; echo 'objet créé'; } function __destruct() { echo 'objet detruit'; } $monAnniversaire = new Date(18,4,1911); echo $monAnniversaire->jour. "/". $monAnniversaire->mois. "/". $monAnniversaire->annee; unset($monAnniversaire); ?>

17 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 301 2.3. La manipulation d'un objet Objets passés par référence : –Depuis PHP5, >< PHP 4 objets passés par valeur –On manipule des références et non pas le contenu des objets –Phénomène de l'aliasing

18 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 302 <?php // script PHP5, le resultat est different en PHP 4 class Date { public $jour; public $mois; public $annee; } $monAnniversaire = new Date(); $monAnniversaire->jour = 18; $monAnniversaire->mois = 4; $monAnniversaire->annee = 1911; $tonAnniversaire = $monAnniversaire; $tonAnniversaire->annee = 1982; echo $tonAnniversaire->annee; // affiche 1982, en PHP 5 echo " "; echo $monAnniversaire->annee; // affiche aussi 1982, en PHP 5 ?>

19 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 303 <?php // FORCER L'ALIASING EN PHP 4 !, OK en PHP 5 class Date { var $jour; var $mois; var $annee; } $monAnniversaire = new Date(); $monAnniversaire->jour = 18; $monAnniversaire->mois = 4; $monAnniversaire->annee = 1911; $tonAnniversaire = & $monAnniversaire; $tonAnniversaire->annee = 1982; echo $tonAnniversaire->annee; echo " "; echo $monAnniversaire->annee; ?>

20 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 304 2.3. La manipulation d'un objet Objets passés par référence : => 2 conséquences : –Comparer deux objets: comparer le contenu et pas seulement la référence !!! –Copier un objet (2 objets différents, mais au contenu identique) nécessite un traitement particulier

21 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 305 2.3. La manipulation d'un objet Comparer deux objets : –Tester l'égalité de tous les attributs : opérateur == –Tester l'égalité des références (identité des objets): opérateur ===

22 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 306 <?php class Date { public $jour; public $mois; public $annee; } $monAnniversaire = new Date(); $monAnniversaire->jour = 18; $monAnniversaire->mois = 4; $monAnniversaire->annee = 1911; $unAnniversaire = new Date(); $unAnniversaire->jour = 18; $unAnniversaire->mois = 4; $unAnniversaire->annee = 1911; $tonAnniversaire = $monAnniversaire; if ($monAnniversaire == $tonAnniversaire) echo "monAnniversaire == tonAnniversaire"; if ($monAnniversaire === $tonAnniversaire) echo "monAnniversaire === tonAnniversaire"; if ($monAnniversaire == $unAnniversaire) echo "monAnniversaire == unAnniversaire"; if ($monAnniversaire === $unAnniversaire) echo "monAnniversaire === unAnniversaire"; ?>

23 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 307 2.3. La manipulation d'un objet Copier un objet : –Fonction : clone -Où est l'objet à copier. -Copiage bit à bit de toutes les valeurs de l'objets source vers l'objet destination –Possible de redéfinir son comportement en définissant une méthode __clone() dans la classe, pour modifier l'objet cloné par clone() (en utilisant $this)‏

24 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 308 <?php class Date { public $jour; public $mois; public $annee; } $monAnniversaire = new Date(); $monAnniversaire->jour = 18; $monAnniversaire->mois = 4; $monAnniversaire->annee = 1911; $tonAnniversaire = clone $monAnniversaire; echo $tonAnniversaire->jour. "/". $tonAnniversaire->mois. "/". $tonAnniversaire->annee; ?>

25 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 309 <?php class Date { public $jour; public $mois; public $annee; function __clone() { $this->jour +=1; $this->mois +=1; $this->annee +=1; } $monAnniversaire = new Date(); $monAnniversaire->jour = 18; $monAnniversaire->mois = 4; $monAnniversaire->annee = 1911; $tonAnniversaire = clone $monAnniversaire; echo $tonAnniversaire->jour. "/". $tonAnniversaire->mois. "/". $tonAnniversaire->annee; ?>

26 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 310 3. Les fondamentaux OO en PHP 3.1. L'encapsulation 3.2. L'héritage 3.3. Le polymorphisme

27 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 311 3.1. L'encapsulation Par défaut, attributs et méthodes sont « public » -Méthodes: pas de modificateur de visibilité nécessaire (= public)‏ -Attributs: si pas de modificateur de visibilité, on doit spécifier « var » (= public)‏ class Voiture { var $nbreLitre = 30; // = public function donneConso($nbreKm) { return $this->nbreLitre * $nbreKm; }

28 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 312 3.1. L'encapsulation Possible de contrôler l'accès aux membres de la classe -“private”: accessible uniquement depuis la classe elle- même -“protected”: accessible uniquement depuis la classe elle- même et depuis ses sous-classes Possible d'utiliser des « getter » et des « setter »

29 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 313 <?php class Voiture { private $nbreLitre; function getNbreLitre() { return $this->nbreLitre; } function setNbreLitre($nbreLitre) { $this->nbreLitre = $nbreLitre; } function donneConso($nbreKm) { return $this->nbreLitre * $nbreKm; } function donneConsoAnnuelle($nbreKm,$nbreJours=20) { return $this->donneConso($nbreKm) * $nbreJours; } $uneVoiture = new Voiture; $uneVoiture->setNbreLitre(30); echo "consommation annuelle : ". $uneVoiture- >donneConsoAnnuelle(100, 30); echo " pour un nbre de litre : ". $uneVoiture->getNbreLitre(); ?>

30 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 314 3.2. L'héritage Héritage simple et strict : Simple : une seule super-classe Strict : toute méthode ré-écrite doit être compatible avec celle de la classe mère (possible d'ajouter des paramètres supplémentaires aux méthodes réécrites, mais ils doivent être facultatifs; possible de supprimer des paramètres obligatoires dans les méthodes réécrites) (sinon warning E_STRICT)‏ Mot-clef: extends

31 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 315 <?php class Date { public $jour; public $mois; public $annee; } class DateHeure extends Date { public $heure; public $minute; public $seconde; } $uneDateHeure = new DateHeure(); $uneDateHeure->jour = 18; $uneDateHeure->mois = 4; $uneDateHeure->annee = 1911; $uneDateHeure->heure = 18; $uneDateHeure->minute = 30; $uneDateHeure->seconde = 10; echo $uneDateHeure->jour. "/". $uneDateHeure->mois. "/". $uneDateHeure->annee. " "; echo $uneDateHeure->heure. "h". $uneDateHeure->minute. ":". $uneDateHeure->seconde; ?>

32 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 316 3.2. L'héritage Ré-écriture : D'attributs : si un attribut est ré-écrit dans une classe fille, c'est sa dernière définition qui est utilisée pour déterminer la valeur par défaut dans l'objet de la classe fille De méthodes : respect de l'héritage strict pour éviter les warnings Appel possible de la méthode de la super-classe, par « parent:: () »

33 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 317 <?php class Vehicule { public $nombreRoues; function afficher() { echo "vehicule : nbre roues ". $this->nombreRoues; } class Voiture extends Vehicule { public $tailleCoffre; function afficher() parent::afficher(); echo "voiture : taille du coffre ". $this->tailleCoffre; } ?> 3.2. L'héritage

34 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 318 3.3. Le polymorphisme Polymorphisme réduit, mais existant: Nécessite un typage : donc uniquement possible via les paramètres de fonction (PHP 5 uniquement)‏ Seulement sur les classes, pas sur les types de base

35 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 319 <?php class Vehicule { public $nombreRoues; function afficher() { echo "vehicule : nbre roues ". $this->nombreRoues; } class Voiture extends Vehicule { public $tailleCoffre; function afficher() parent::afficher(); echo "voiture: taille du coffre ". $this->tailleCoffre; } function affichage(Vehicule $unVehicule) { $unVehicule->afficher(); } $maVoiture = new Voiture(); $maVoiture->tailleCoffre=300; $maVoiture->nombreRoues=4; affichage($maVoiture); ?>

36 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 320 4. OO avancé en PHP 4.1. Classe abstraite 4.2. Interface et implémentation 4.3. Eléments « final » 4.4. Eléments « static »

37 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 321 4.1. Classe abstraite Classe ne pouvant pas être instantiée (sinon erreur « fatale »)‏ Peut contenir des attributs et des méthodes « classiques » Peut contenir des méthodes « abstract »: si une méthode est « abstract », alors la classe doit être « abstract »

38 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 322 4.1. Classe abstraite Méthode « abstract » : Méthode pas implémentée (body est vide, la classe contient la seule la signature de la méthode)‏ Doit être implémentée dans la sous-classe (ou être re- déclarée abstract dans cette sous-classe)‏ // classe abstract, pas de methode abstract abstract class Vehicule { public $nombreRoues; function afficher() { echo "vehicule : nbre roues ". $this->nombreRoues; }

39 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 323 2.2. L'instantiation d'un objet <?php abstract class Polygone { public $nbreCotes; abstract function calculSurface(); // devra etre ré-écrite !!! } class Rectangle extends Polygone { public $longueur; public $largeur; function __construct($longueur, $largeur) { $this->longueur = $longueur; $this->largeur = $largeur; $this->nbreCotes = 4; } function calculSurface() { return $this->longueur * $this->largeur; } function affiche() { return $this->nbreCotes. $this->largeur. $this->longueur. $this->calculSurface(); } $unRectangle = new Rectangle(2,5); echo $unRectangle->affiche(); ?>

40 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 324 4.2. Interface et implémentation Une interface est un composant, qui n'est pas une classe Une interface contient une ou plusieurs signature(s) de méthodes Une classe peut implémenter 0, 1 ou plusieurs interfaces Une classe qui implémente une interface doit implémenter (donner un corps à) chaque méthode de l'interface

41 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 325 <?php interface estAffichable { function affiche(); } interface estImprimable { function imprime($nbreFois); } abstract class Vehicule { public $nombreRoues; function affiche() { return "vehicule : nbre roues ". $this->nombreRoues; } class Voiture extends Vehicule implements estAffichable, estImprimable { public $tailleCoffre; function imprime($nbreFois) { for ($i =0; $i < $nbreFois; $i++) { echo $this->affiche(); echo " "; } function affiche() { return parent::affiche(). " voiture : taille du coffre ". $this->tailleCoffre; } $maVoiture = new Voiture(); $maVoiture->tailleCoffre=300; $maVoiture->nombreRoues=4; $maVoiture->imprime(2); ?>

42 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 326 <?php interface estAffichable { function affiche(); } interface estImprimable { function imprime($nbreFois); } abstract class Vehicule { public $nombreRoues; function affiche() { return "vehicule : nbre roues ". $this->nombreRoues; } class Voiture extends Vehicule implements estAffichable, estImprimable { public $tailleCoffre; function imprime($nbreFois) { for ($i =0; $i < $nbreFois; $i++) { echo $this->affiche(); echo " "; } function affiche() { return parent::affiche(). " voiture : taille du coffre ". $this->tailleCoffre; } function imprimante(estImprimable $imprimable) { // prend une interface comme paramètre $imprimable->imprime(3); } $maVoiture = new Voiture(); $maVoiture->tailleCoffre=300; $maVoiture->nombreRoues=4; imprimante($maVoiture); // casting d'un objet dans son interface !!! ?>

43 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 327 4.3. Elements « final » Classe « final » : ne pouvant pas avoir de sous-classe Méthode « final » : ne pouvant pas être réécrite final class Voiture { public $tailleCoffre; final function afficher() { echo "vehicule : nbre roues ". $this->nombreRoues; }

44 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 328 4.4. Elements « static » Deux possibilités : Appel statique d'une méthode classique Déclaration statique d'un attribut ou d'une méthode (de classe)‏

45 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 329 4.4. Elements « static » Appel statique d'une méthode “classique” : appel de la méthode, sans passer par l'objet, directement sur la classe La méthode ne doit pas contenir de $this (car pas défini, puisque pas d'objet)‏ Syntaxe : :: ()‏ <?php class Voiture { function test() { echo "test"; } echo Voiture::test(); ?>

46 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 330 4.4. Elements « static » Déclaration « static » d'un attribut ou d'une méthode Éléments « static » ne sont appelables que sur la classe seulement $this ne peut pas être employé (car pas défini, puisque pas d'objet)‏ $self désigne la classe elle-même Syntaxe : :: ()‏ ::$

47 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 331 <?php class Voiture { static $roues = 4; static function test() { return self::$roues; } echo Voiture::$roues++; // update class attribute echo Voiture::test(); // affiche 4 5 ?> 4.4. Eléments « static »

48 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 332 5. Quelques fonctions 5.1. Constantes de debug (__class__... 5.2. Affichage d'objet (__toString)‏ 5.3. Fonctions de type (instance of, getClass, get_parent_class)‏ 5.4. Divers : __autoload, __set, __call, __get

49 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 333 5.1. Constantes de debug Deux méta-constantes utiles pour le debug ou le tracing : __CLASS__ : donne le nom de la classe courante __METHOD__ : donne le nom de la méthode courante <?php class Voiture { function test() { echo "classe : ". __CLASS__. ", methode : ". __METHOD__ ; } $voiture = new Voiture(); $voiture->test(); ?>

50 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 334 5.2. Affichage d'objet Affichage direct d'un objet => erreur ! Utilisation de la méthode __toString() : Ré-écrire cette méthode dans une classe Affichage direct d'un objet de cette classe => exécution de la méthode __toString réécrite <?php class Voiture { function __toString() { return "ceci est une voiture"; } $voiture = new Voiture(); echo $voiture; ?>

51 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 335 5.3. Fonctions de type d'objet Vérifier qu'un objet appartient à une classe donnée ou à une de ses sous-classes instance of Donner la classe d'un objet : get_class( )‏ Donner la classe père d'un objet : get_parent_class( )‏

52 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 336 5.4. Quelques fonctions en vrac... __sleep() et __wakeup() : permettent de gérer la mise en session d'objets connectés à des ressources externes (fichiers...) __set($nom, $valeur) : méthode appelée lors de l'affectation d'une valeur à un attribut inexistant __get($nom) : méthode appelée lors de la consultation d'un attribut inexistant (Mutator)‏ __call($nom, $valeur) : méthode appelée lors de l'appel de méthodes inexistantes ($valeur = 1 tableau de paramètres) (Accessor)‏

53 ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 337 5.4. Quelques fonctions en vrac... __autoload($nom) : Fonction appelée lors de l'instantiation d'un objet d'une classe inexistante Le paramètre $nom est le nom de la classe manquante Permet de charger automatiquement le fichier PHP <?php function __autoload($nom) { require_once($nom. ".class.php"); } $voiture = new Voiture(); echo $voiture; ?>


Télécharger ppt "ESA Ecole Supérieure des Affaires Ernaelsten Gérard - Frédéric FiléePage 285 Cours de Programmation Web : PHP Chapitre 5 : Orienté objet en PHP."

Présentations similaires


Annonces Google