11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA

Slides:



Advertisements
Présentations similaires
PHP5 its a kind of magic. Chargement automatique function __autoload( $nom_classe ) { require_once('obj/'.$nom_classe.'.class.php'); } si on exécute le.
Advertisements

PHP Accès au système de fichiers
Spécialisation/généralisation Héritage Polymorphisme
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
PHP5 poo.
PHP5 its a kind of magic. Chargement automatique function __autoload( $nom_classe ) { require_once('obj/'.$nom_classe.'.class.php'); } si on exécute le.
Programmation Orientée Objet (POO)
11:16:331 Programmation Web Programmation Web : Formulaires HTML Jérôme CUTRONA
Jérôme CUTRONA PHP et bases de données Jérôme CUTRONA 01:07:51 Programmation Web
Programmation Web : Protocole HTTP
PhpMyAdmin 01:08:02 Programmation Web
Jérôme CUTRONA PHP objet Jérôme CUTRONA 01:08:01 Programmation Web
Jérôme CUTRONA PHP PDO Jérôme CUTRONA 01:08:01 Programmation Web
Bases de données Objet singleton pour la connexion
PHP Interface base de données
Bases de données Objet singleton pour la connexion
Introduction à la POO: Les classes vs les objets
Le langage PHP 5.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Langage Oriente Objet Cours 4.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
C++ : classes Introduction aux Langages Orientés Objets
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
Structures de données IFT-2000
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Introduction au paradigme orienté-objet (suite)
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Chapitre 9 Les sous-programmes.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Introduction au langage PHP Licence Pro Cours Internet / Intranet Utilité Historique Exemples Fonctions PHP Classes.
Objectifs À la fin de ce cours, vous serez capables de :
JavaScript Nécessaire Web.
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
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.
11/04/ L'héritage Cours 7 Cours 7.
Programmation objet La base.
Cours 7 Classes locales Clonage Divers: tableaux.
Créer des packages.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
Tutorat en bio-informatique
5ième Classe (Mercredi, 19 octobre) Prog CSI2572.
PHP 7° PARTIE : PROGRAMMATION OBJET
Tutorat en bio-informatique Le 14 novembre Au programme… Les objets –Propriétés (attributs) –Constructeurs –Méthodes.
Réaliser par: Sadok Amel Cheboui hassiba
PHP objet Jérôme CUTRONA 10:13:27 Programmation Web
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Schéma de conception Factory Method Exemple Sylvain Giroux.
Cours du 5 novembre.
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
Les classes Introduction aux Langages Orientés Objets
PHP5 objet "avancé" Jérôme CUTRONA 09:56:48 Programmation Web
 Formulaires HTML : traiter les entrées utilisateur
Fichier=open('monfichier.txt','w') >>> fichier.write('bonjour\n') 8 >>> liste ['le chien', 'le chat', 'le loup'] >>> for s in liste: fichier.write(s+'\n')
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Protocole HTTP, cookies, sessions, authentification
Héritage Conception par Objet et programmation Java
1 PHP 5 Notions fondamentales (niveau 1 cours #3) Formation continue – Cégep de Sainte-Foy François G Couillard.
Bases de données Singleton pour la connexion
LES CLASSES ET LES OBJETS
Jérôme CUTRONA PHP5 objet "avancé" Jérôme CUTRONA 03:07:13 Programmation Web
Bases de données Singleton pour la connexion
Transcription de la présentation:

11:37:32 Programmation Web PHP5 objet "avancé" Jérôme CUTRONA

211:37:32 Programmation Web Autochargement de classes __autoload Appelée si une classe n'est pas encore définie au moment de son utilisation Appelée si une classe n'est pas encore définie au moment de son utilisation Dernière chance pour inclure automatiquement une définition de classe Dernière chance pour inclure automatiquement une définition de classe Besoin dune règle claire entre le nom de classe et le nom du fichier contenant sa définition Besoin dune règle claire entre le nom de classe et le nom du fichier contenant sa définition function __autoload($class_name) { require_once $class_name. '.class.php'; } $a = new Cercle() ; function __autoload($class_name) { require_once $class_name. '.class.php'; } $a = new Cercle() ; require_once 'Cercle.class.php'; require_once 'Cercle.class.php';

311:37:32 Programmation Web Méthodes "magiques" Ensemble de méthodes commençant par ' __ Ensemble de méthodes commençant par ' __ __construct, __destruct __construct, __destruct __toString __toString __clone __clone __get, __set __get, __set __isset, __unset __isset, __unset __call __call __callStatic (PHP 5.3) __callStatic (PHP 5.3) __invoke() __invoke() __sleep, __wakeup __sleep, __wakeup __set_state() __set_state()

411:37:32 Programmation Web __construct, __destruct __construct __construct Constructeur de l'objet Constructeur de l'objet Appelé lors de l'utilisation de new Appelé lors de l'utilisation de new $c = new Point(10, -12) ; $c = new Point(10, -12) ; __destruct __destruct Destructeur de l'objet Destructeur de l'objet Appelé lorsque la dernière référence sur un objet est perdue Appelé lorsque la dernière référence sur un objet est perdue $c = new Point(10, -12) ; $c = null ; $c = new Point(10, -12) ; $c = null ;

511:37:32 Programmation Web __toString Permet de décrire le comportement de la classe lorsqu'une instance est convertie en chaîne Permet de décrire le comportement de la classe lorsqu'une instance est convertie en chaîne Avant PHP 5.2, __toString n'est appelée que lors d'une combinaison directe avec echo ou print Avant PHP 5.2, __toString n'est appelée que lors d'une combinaison directe avec echo ou print $a = new Affichable('Bonjour'); echo $a ; $a = new Affichable('Bonjour'); echo $a ;

611:37:32 Programmation Web __toString class Affichable { // en PHP public $d; public $d; public function __construct($_d) public function __construct($_d) { $this->d = $_d; } { $this->d = $_d; } public function __toString() public function __toString() { return $this->d; } { return $this->d; }} $a = new Affichable('Bonjour'); echo $a ; echo "Mon objet affichable :".$a."\n" ; echo "Mon objet affichable :$a\n" ; Bonjour Mon objet affichable :Object id #1

711:37:32 Programmation Web __clone Permet de décrire le comportement de la classe lorsqu'une instance est clonée Permet de décrire le comportement de la classe lorsqu'une instance est clonée $objet2 = clone $objet1 ; $objet2 = clone $objet1 ; Clonage par défaut : copie des propriétés Clonage par défaut : copie des propriétés Nécessaire si : Nécessaire si : une propriété est un objet devant être dupliqué une propriété est un objet devant être dupliqué compteur d'instances d'une classe compteur d'instances d'une classe Ne peut PAS être appelée directement Ne peut PAS être appelée directement Intervient après la copie superficielle (=) Intervient après la copie superficielle (=) Ne concerne que l'objet cloné (identiques) Ne concerne que l'objet cloné (identiques)

class A { } class B { } class Z { protected $a ; protected $a ; protected $b ; protected $b ; public function __construct() { public function __construct() { $this->a = new A() ; $this->a = new A() ; $this->b = new B() ; } $this->b = new B() ; } } $z1 = new Z() ; $z1 = new Z() ; var_dump($z1) ; var_dump($z1) ; $z2 = clone $z1 ; $z2 = clone $z1 ; var_dump($z2) ; var_dump($z2) ; 811:37:32 Programmation Web __clone object(Z)#1 (2) { ["a:protected"]=> object(A)#2 (0) { } ["a:protected"]=> object(A)#2 (0) { } ["b:protected"]=> object(B)#3 (0) { } ["b:protected"]=> object(B)#3 (0) { }} object(Z)#4 (2) { ["a:protected"]=> object(A)#2 (0) { } ["a:protected"]=> object(A)#2 (0) { } ["b:protected"]=> object(B)#3 (0) { } ["b:protected"]=> object(B)#3 (0) { }}

class A { } class B { } class Z { protected $a ; protected $a ; protected $b ; protected $b ; public function __construct() { public function __construct() { $this->a = new A() ; $this->a = new A() ; $this->b = new B() ; } $this->b = new B() ; } } $z1 = new Z() ; $z1 = new Z() ; $z2 = clone $z1 ; $z2 = clone $z1 ; 911:37:32 Programmation Web __clone Z $a$a$a$a $b$b$b$b $z1 A B Z $a$a$a$a $b$b$b$b $z2 Clonage de l'objet Z : duplication de l'objet par copie superficielle des attributs (simple =)

class A { } class B { } class Z { protected $a ; protected $a ; protected $b ; protected $b ; public function __construct() { public function __construct() { $this->a = new A() ; $this->a = new A() ; $this->b = new B() ; } $this->b = new B() ; } public function __clone() { public function __clone() { $this->a = clone $this->a ; } $this->a = clone $this->a ; } } $z1 = new Z() ; $z1 = new Z() ; var_dump($z1) ; var_dump($z1) ; $z2 = clone $z1 ; $z2 = clone $z1 ; var_dump($z2) ; var_dump($z2) ; 1011:37:32 Programmation Web __clone object(Z)#1 (2) { ["a:protected"]=> object(A)#2 (0) { } ["a:protected"]=> object(A)#2 (0) { } ["b:protected"]=> object(B)#3 (0) { } ["b:protected"]=> object(B)#3 (0) { }} object(Z)#4 (2) { ["a:protected"]=> object(A)#5 (0) { } ["a:protected"]=> object(A)#5 (0) { } ["b:protected"]=> object(B)#3 (0) { } ["b:protected"]=> object(B)#3 (0) { }}

class A { } class B { } class Z { protected $a ; protected $a ; protected $b ; protected $b ; public function __construct() { public function __construct() { $this->a = new A() ; $this->a = new A() ; $this->b = new B() ; } $this->b = new B() ; } public function __clone() { public function __clone() { $this->a = clone $this->a ; } $this->a = clone $this->a ; } } $z1 = new Z() ; $z1 = new Z() ; $z2 = clone $z1 ; $z2 = clone $z1 ; 1111:37:32 Programmation Web __clone Z $a$a$a$a $b$b$b$b $z1 A B Z $a$a$a$a $b$b$b$b $z2 Clonage de l'objet Z : duplication de l'objet par copie superficielle des attributs (simple =) A

1211:37:32 Programmation Web __get, __set Permet de surcharger l'accès à des données membres inaccessibles d'une classe en lecture ( __get ) et en écriture ( __set ) Permet de surcharger l'accès à des données membres inaccessibles d'une classe en lecture ( __get ) et en écriture ( __set ) Ne sont déclenchées que si la propriété demandée n'est pas accessible (private, protected ou inexistante) Ne sont déclenchées que si la propriété demandée n'est pas accessible (private, protected ou inexistante) Les méthodes ne doivent PAS être static Les méthodes ne doivent PAS être static Les méthodes surchargées doivent être public Les méthodes surchargées doivent être public Permet de donner un accès simplifié à des propriétés non accessibles directement Permet de donner un accès simplifié à des propriétés non accessibles directement Permet éventuellement d'effectuer des contrôles Permet éventuellement d'effectuer des contrôles

1311:37:32 Programmation Web __get, __set class Point { private $coord ; private $coord ; public function __construct($_x, $_y) { public function __construct($_x, $_y) { if (!is_numeric($_x) || !is_numeric($_y)) { if (!is_numeric($_x) || !is_numeric($_y)) { throw new Exception( throw new Exception( "Paramètres non numériques ($_x, $_y)") ; "Paramètres non numériques ($_x, $_y)") ; } } $this->coord['x'] = $_x ; $this->coord['x'] = $_x ; $this->coord['y'] = $_y ; $this->coord['y'] = $_y ; }… $p = new Point(1, 12) ;

1411:37:32 Programmation Web __get public function __get($_prop) { public function __get($_prop) { if (!array_key_exists($_prop, $this->coord)) { if (!array_key_exists($_prop, $this->coord)) { throw new Exception( throw new Exception( "Accès à une propriété inconnue ($_prop)") ; "Accès à une propriété inconnue ($_prop)") ; } return $this->coord[$_prop] ; return $this->coord[$_prop] ; }… echo "p: ({$p->x}, {$p->y})\n" ; echo "p: ({$p->z}, {$p->t})\n" ; p: (1, 12) Fatal error: Uncaught exception 'Exception' with message 'Accès à une propriété inconnue (z)' in surcharge.php:19 Stack trace: #0 surcharge.php(37): Point->__get('z') #1 {main} thrown in surcharge.php on line 19 #1 {main} thrown in surcharge.php on line 19

1511:37:32 Programmation Web __set public function __set($_prop, $_val) { public function __set($_prop, $_val) { if (!is_numeric($_val)) { if (!is_numeric($_val)) { throw new Exception( throw new Exception( "Valeur non numérique ($_val)") ; "Valeur non numérique ($_val)") ; } } if (!array_key_exists($_prop, $this->coord)) { if (!array_key_exists($_prop, $this->coord)) { throw new Exception( throw new Exception( "Accès à une propriété inconnue ($_prop)") ; "Accès à une propriété inconnue ($_prop)") ; } } return $this->coord[$_prop] = $_val ; return $this->coord[$_prop] = $_val ; }} $p->x = -12 ; echo "p: ({$p->x}, {$p->y})\n" ; p: (-12, 12)

1611:37:32 Programmation Web __isset, __unset Permet de surcharger l'accès à des données membres inaccessibles d'une classe par isset() ( __isset ) et par unset() ( __unset ) Permet de surcharger l'accès à des données membres inaccessibles d'une classe par isset() ( __isset ) et par unset() ( __unset ) Ne sont déclenchées que si la propriété demandée n'est pas accessible (private, protected ou inexistante) Ne sont déclenchées que si la propriété demandée n'est pas accessible (private, protected ou inexistante) Les méthodes ne doivent PAS être static Les méthodes ne doivent PAS être static Les méthodes surchargées doivent être public Les méthodes surchargées doivent être public Permet de donner un accès simplifié à des propriétés non accessibles directement Permet de donner un accès simplifié à des propriétés non accessibles directement Permet éventuellement d'effectuer des contrôles Permet éventuellement d'effectuer des contrôles

1711:37:32 Programmation Web __call Permet de surcharger l'accès à des méthodes non accessibles d'une classe Permet de surcharger l'accès à des méthodes non accessibles d'une classe N'est déclenchée que si la méthode demandée n'est pas accessible (private, protected ou inexistante) N'est déclenchée que si la méthode demandée n'est pas accessible (private, protected ou inexistante) Ne doit PAS être static Ne doit PAS être static Doit être public Doit être public Permet de donner un accès simplifié à des méthodes non accessibles directement Permet de donner un accès simplifié à des méthodes non accessibles directement

1811:37:32 Programmation Web __call class Moteur { public function demarrer() { echo "Vroummm\n" ; } public function demarrer() { echo "Vroummm\n" ; } public function arreter() { echo "...\n" ; } } public function arreter() { echo "...\n" ; } } class Voiture { private $moteur ; private $moteur ; public function __construct() public function __construct() { $this->moteur = new Moteur() ; } { $this->moteur = new Moteur() ; } public function __call($_method, $_params) { public function __call($_method, $_params) { if (!method_exists($this->moteur, $_method)) if (!method_exists($this->moteur, $_method)) throw new Exception( throw new Exception( "Méthode inconnue ($_method)") ; "Méthode inconnue ($_method)") ; call_user_func_array(array($this->moteur, call_user_func_array(array($this->moteur, $_method), $_method), $_params) ; } } $_params) ; } }

1911:37:32 Programmation Web __call $v = new Voiture() ; $v->demarrer() ; $v->arreter() ; $v->avancer() ; Vroummm... Fatal error: Uncaught exception 'Exception' with message 'Méthode inconnue (avancer)' in surcharge.php:61 Stack trace: #0 [internal function]: Voiture->__call('avancer', Array) #0 [internal function]: Voiture->__call('avancer', Array) #1 surcharge.php(70): Voiture->avancer() #1 surcharge.php(70): Voiture->avancer() #2 {main} thrown in surcharge.php on line 61 #2 {main} thrown in surcharge.php on line 61

2011:37:32 Programmation Web __callStatic (PHP 5.3) Permet de surcharger l'accès à des méthodes static non accessibles d'une classe Permet de surcharger l'accès à des méthodes static non accessibles d'une classe N'est déclenchée que si la méthode demandée n'est pas accessible (private, protected ou inexistante) N'est déclenchée que si la méthode demandée n'est pas accessible (private, protected ou inexistante) Doit être static Doit être static Doit être public Doit être public Permet de donner un accès simplifié à des méthodes non accessibles directement Permet de donner un accès simplifié à des méthodes non accessibles directement

2111:37:32 Programmation Web __callStatic (PHP 5.3) class Moteur { public static function demarrer() public static function demarrer() { echo "Vroummm\n" ; } public static function arreter() public static function arreter() { echo "...\n" ; } } class Voiture { public static function __callStatic($_method, $_params){ if (!method_exists("Moteur", $_method)) if (!method_exists("Moteur", $_method)) throw new Exception( throw new Exception( "Méthode statique inconnue ($_method)") ; "Méthode statique inconnue ($_method)") ; call_user_func_array(array("Moteur", $_method), call_user_func_array(array("Moteur", $_method), $_params) ; } } $_params) ; } }

2211:37:32 Programmation Web __callStatic (PHP 5.3) Voiture::demarrer() ; Voiture::arreter() ; Voiture::avancer() ; Vroummm... Fatal error: Uncaught exception 'Exception' with message 'Accès à une méthode statique inconnue (avancer)' in callStatic.php on line 8 Call Stack: 1. {main}() callStatic.php:0 2. Voiture::avancer() callStatic.php:17 3. Voiture::__callStatic() callStatic.php:0

__invoke class Traceur { private $_nomFichier = null ; private $_nomFichier = null ; private $_ressource = null ; private $_ressource = null ; public function __construct($fichier) { public function __construct($fichier) { $this->_nomFichier = $fichier ; $this->_nomFichier = $fichier ; $this->_ouvrirFichier() ; $this->_ouvrirFichier() ; $this->ecrire('Fin construction') ; $this->ecrire('Fin construction') ; } public function __destruct() { public function __destruct() { $this->ecrire('Prêt pour la destruction') ; $this->ecrire('Prêt pour la destruction') ; fclose($this->_ressource) ; fclose($this->_ressource) ; } private function _ouvrirFichier() { private function _ouvrirFichier() { $this->_ressource = fopen($this->_nomFichier, 'a') ; $this->_ressource = fopen($this->_nomFichier, 'a') ; } public function ecrire($texte) { public function ecrire($texte) { $ligne = strftime('%c'). ' : '. $texte. "\n" ; $ligne = strftime('%c'). ' : '. $texte. "\n" ; fwrite($this->_ressource, $ligne) ; fwrite($this->_ressource, $ligne) ; }… 2311:37:32 Programmation Web

__invoke … public function __invoke($texte) { public function __invoke($texte) { $this->ecrire($texte) ; $this->ecrire($texte) ; }} $t = new Traceur('log.txt') ; $t('Début') ; sleep(2) ; $t('Suite') ; sleep(3) ; $t('Terminé !') ; readfile('log.txt') ; 2411:37:32 Programmation Web Tue Oct 11 00:04: : Fin construction Tue Oct 11 00:04: : Début Tue Oct 11 00:04: : Suite Tue Oct 11 00:04: : Terminé !

Linéarisation dobjets Stockage dune variable dans une forme « dormante » entre deux scripts Stockage dune variable dans une forme « dormante » entre deux scripts La variable est réduite à une chaîne de caractères contenant ses caractéristiques La variable est réduite à une chaîne de caractères contenant ses caractéristiques La délinéarisation permet de retrouver la variable restaurée dans sa forme utilisable La délinéarisation permet de retrouver la variable restaurée dans sa forme utilisable Les objets peuvent être (dé)linéarisés Les objets peuvent être (dé)linéarisés Les méthodes de classe posent problème Les méthodes de classe posent problème Les attributs de type « ressource » posent problème Les attributs de type « ressource » posent problème 2511:37:32 Programmation Web

__sleep, __wakeup class Traceur { private $_nomFichier = null ; private $_nomFichier = null ; private $_ressource = null ; private $_ressource = null ; public function __construct($fichier) { public function __construct($fichier) { $this->_nomFichier = $fichier ; $this->_nomFichier = $fichier ; $this->_ouvrirFichier() ; $this->_ouvrirFichier() ; $this->ecrire('Fin construction') ; $this->ecrire('Fin construction') ; } public function __destruct() { public function __destruct() { $this->ecrire('Prêt pour la destruction') ; $this->ecrire('Prêt pour la destruction') ; fclose($this->_ressource) ; fclose($this->_ressource) ; } private function _ouvrirFichier() { private function _ouvrirFichier() { $this->_ressource = fopen($this->_nomFichier, 'a') ; $this->_ressource = fopen($this->_nomFichier, 'a') ; } public function ecrire($texte) { public function ecrire($texte) { $ligne = strftime('%c'). ' : '. $texte. "\n" ; $ligne = strftime('%c'). ' : '. $texte. "\n" ; fwrite($this->_ressource, $ligne) ; fwrite($this->_ressource, $ligne) ; }… 2611:37:32 Programmation Web Type ressource : Ne peut pas être linéarisé !

__sleep, __wakeup … public function __sleep() { public function __sleep() { return array('_nomFichier') ; return array('_nomFichier') ; } public function __wakeup() { public function __wakeup() { $this->_ouvrirFichier() ; $this->_ouvrirFichier() ; $this->ecrire('Debout là-dedans !') ; $this->ecrire('Debout là-dedans !') ; }} if (isset($_SESSION['TRACEUR'])) { $t = $_SESSION['TRACEUR'] ; $t = $_SESSION['TRACEUR'] ;} else { $t = new Traceur('log.txt') ; $t = new Traceur('log.txt') ;} $t('Début') ; sleep(2) ; $t('Suite') ; sleep(3) ; $t('Terminé !') ; $_SESSION['TRACEUR'] = $t ; readfile('log.txt') ; 2711:37:32 Programmation Web Tue Oct 11 00:06: : Fin construction Tue Oct 11 00:06: : Début Tue Oct 11 00:06: : Suite Tue Oct 11 00:06: : Terminé ! Tue Oct 11 00:06: : Prêt pour la destruction Tue Oct 11 00:07: : Debout là-dedans ! Tue Oct 11 00:07: : Début Tue Oct 11 00:07: : Suite Tue Oct 11 00:07: : Terminé !

2811:37:32 Programmation Web Abstraction de classes Classes et méthodes abstraites Classes et méthodes abstraites Impossibilité de créer une instance dune classe abstraite Impossibilité de créer une instance dune classe abstraite Toute classe contenant une méthode abstraite doit être définie abstraite Toute classe contenant une méthode abstraite doit être définie abstraite Méthode abstraite : pas d'implémentation Méthode abstraite : pas d'implémentation Implémentation de toutes les méthodes abstraites d'une classe dans la classe dérivée Implémentation de toutes les méthodes abstraites d'une classe dans la classe dérivée Méthodes abstraites protégées ou publiques Méthodes abstraites protégées ou publiques

2911:37:32 Programmation Web Abstraction de classes : exemple abstract class Abstraite { abstract protected function nom() ; function affiche() { echo "Mon nom est '{$this->nom()}'" ; }} class Concrete extends Abstraite { protected function nom() { protected function nom() { return "Concrete" ; }} $a = new Abstraite() ; $c = new Concrete() ; $c->affiche() ; Classe abstraite Méthode abstraite protégée Concrétisation de la classe abstraite Implémentation de la méthode abstraite Instanciation de la classe abstraite Instanciation de la classe concrète Fatal error: Cannot instantiate abstract class Abstraite in dummy.php on line 72 Mon nom est 'Concrete'

3011:37:32 Programmation Web Typage des paramètres Les paramètres des fonctions et méthodes peuvent être typés Les paramètres des fonctions et méthodes peuvent être typés Les types sont alors forcément des types définis par l'utilisateur ou des tableaux (PHP 5.1) Les types sont alors forcément des types définis par l'utilisateur ou des tableaux (PHP 5.1) function puissance(Entier $_n, Entier $_p) { … } function puissance(Entier $_n, Entier $_p) { … }

3111:37:32 Programmation Web Typage des paramètres class Entier { public $v ; public $v ; public function __construct($_v) { public function __construct($_v) { $this->v = $_v ; } $this->v = $_v ; } public function egal(self $a) { public function egal(self $a) { return intval($this->v == $a->v) ; } return intval($this->v == $a->v) ; }} $E1 = new Entier(10) ; $E2 = new Entier(20) ; echo $E1->egal($E2) ; echo $E1->egal(12) ; 0 Argument 1 passed to Entier::egal() must be an instance of Entier, integer given, …

3211:37:32 Programmation Web Interfaces Permet de spécifier quelles méthodes doivent être implémentées par une classe Permet de spécifier quelles méthodes doivent être implémentées par une classe Les méthodes doivent être identiques : Les méthodes doivent être identiques : au niveau du nom au niveau du nom au niveau du nombre de paramètres au niveau du nombre de paramètres au niveau de la nature de paramètres au niveau de la nature de paramètres Une classe peut implémenter plusieurs interfaces Une classe peut implémenter plusieurs interfaces Une classe peu implémenter une interface à n'importe quel niveau de la hiérarchie Une classe peu implémenter une interface à n'importe quel niveau de la hiérarchie

3311:37:32 Programmation Web Interfaces : exemple interface Comparable { public function compare(self $a) ; public function compare(self $a) ;} class Entier implements Comparable { public $v ; public $v ; public function __construct($_v) { public function __construct($_v) { $this->v = $_v ; $this->v = $_v ; } } public function compare(self $a) { public function compare(self $a) { return intval($this->v == $a->v) ; return intval($this->v == $a->v) ; }} Interface Méthode de l'interface Classe implémentant l'interface Méthode de l'interface

Parcours dobjets Parcours des attributs visibles avec foreach Parcours des attributs visibles avec foreach class Point { private $x = 0 ; private $y = 0 ; protected $dim = 2 ; public $nom = "un point" ; public function parcours() { foreach ($this as $prop => $val) foreach ($this as $prop => $val) echo "$prop: $val\n" ; } echo "$prop: $val\n" ; }} $p = new Point() ; foreach ($p as $prop => $val) echo "$prop: $val\n" ; echo "$prop: $val\n" ; $p->parcours() ; 3411:37:32 Programmation Web nom : un point x: 0 y: 0 dim : 2 nom : un point

Mot clé final (méthode) Rend impossible la surcharge dune méthode par les classes filles Rend impossible la surcharge dune méthode par les classes filles class Simple { final public function affiche() { echo "Je suis Simple" ; } } class Etendue extends Simple { public function affiche() { parent::affiche() ; echo " mais aussi Etendue" ; }} 3511:37:32 Programmation Web Cannot override final method Simple::affiche()

Mot clé final (classe) La classe ne peut être étendue La classe ne peut être étendue final class Simple { public function affiche() { echo "Je suis Simple" ; } } class Etendue extends Simple { public function affiche() { parent::affiche() ; echo " mais aussi Etendue" ; }} 3611:37:32 Programmation Web Class Etendue may not inherit from final class (Simple)