SlideShare une entreprise Scribd logo
PHP5 poo
Déclarer une classe en PHP Une classe est un modèle de données  famille d'objets, ou encore moule à objets tous les objets d’une même classe partagent les mêmes attributs et les mêmes méthodes le mot clé  class  permet de déclarer une classe d'objet. class voiture { //code de la classe }
déclarer des attributs  (ou propriétés) class voiture { public $marque = "trabant"; } public, protected, private sont supportés L’un des trois est obligatoire ou le mot clé var (   public) Affectation et même déclaration facultatives!!
déclarer des méthodes (ou propriétés) class voiture { function freiner($force_de_freinage) { //code qui freine }  } public, protected, private sont supportés Implicitement « public »
déclarer des constantes class voiture { const ROUES_MOTRICES = 2;  } Locale à la classe convention classique :  spécifier les constantes en majuscules dans le code pour mieux les identifier
Instanciation class voiture { const ROUES_MOTRICES = 2; public $marque; function freiner($force_de_freinage) { //code qui freine } } $MaVoiture = new voiture();  Les parenthèses sont optionnelles si le constructeur ne nécessite pas de paramètre En PHP5 toute classe doit être déclarée avant d'être utilisée Non obligatoire en PHP4
Accéder à un attribut class voiture { public $marque = "trabant"; } $MaVoiture = new voiture(); echo $MaVoiture->marque;  // affiche trabant
Accéder à une méthode class voiture { function klaxonner() { return "tut tut!!"; } } $MaVoiture = new voiture(); echo $MaVoiture->klaxonner();  // affiche "tut tut!"
Accèder à une constante class voiture { const ROUES = 2; public $marque; function freiner($force_de_freinage) { //code qui freine } } $MaVoiture = new voiture(); echo "ma voiture a ".$MaVoiture::ROUES." roues  ";  // affiche "ma voiture a 2 roues"
référence à l'objet en cours class voiture { public $vitesse = 0; function avance( $temps) {   echo "avance de ".$temps*$this->vitesse." km en ".$temps." h"; } } $MaVoiture = new voiture(); $MaVoiture->vitesse = 100; //la vitesse est de 100km/h $MaVoiture->avance(2); // affiche "avance de 200 km en 2h"
accès statiques appel direct via la classe, pas d’instanciaton  utilisant de l’accesseur :: La référence à l’objet courant $this est alors interdite class voiture { public $roues = 4; function statique() {   return 4; } function dynamique()   { return $this->roues; } } echo voiture::$roues; // affiche un message d’erreur echo voiture::statique(); // affiche 4 echo voiture::dynamique(); // affiche un message d'erreur
Accès statique explicite  Via le mot clé  static Pour les attributs public private ou protected devient facultatif (public par défaut)  class voiture { static $roues = 4 static function statique() { echo 4; } }  echo voiture::$roues; // affiche 4 echo voiture::statique(); // affiche 4 $v = new voiture(); echo $v->roues;  // affiche un message d'erreur echo $v->statique(); //affiche 4 et est sensé afficher un message d'erreur de niveau E_STRICT
Accès à la classe courante class voiture { static $roues = 4; function static() { return self::$roues; } } echo voiture::static(); // CORRECT affiche 4  $v = new voiture(); echo $v->dynamique().&quot;<br />&quot;; //INCORRECT mais affiche 4 et est sensé afficher un message d'erreur de niveau E_STRICT
Exception <?php function inverse($x) { if (!$x) { throw new Exception('Division by zero.'); } else return 1/$x; } try { echo inverse(5) . &quot;\n&quot;; echo inverse(0) . &quot;\n&quot;; } catch (Exception $e) { echo 'Caught exception: ',  $e->getMessage(), &quot;\n&quot;; }
L’héritage en POO permet de regrouper des parties communes dans une classe dite mère  Toute classe dérivant de cette classe mère est appelée classe fille  Une classe fille possède les attributs et méthodes de la classe mère ainsi que des attributs et des méthodes qui lui sont propres  Pas d’héritage multiple en PHP5
Héritage en PHP5 class vehicule { public $marque = &quot;&quot;;  function avance() { //code qui fait avancer le véhicule } function freine() { //code qui fait freiner le vehicule } } class voiture extends vehicule { function klaxonne() { //code qui fait klaxonner la voiture } // la classe voiture possède un attribut marque, une méthode freine et une méthode avance par héritage }
Redéfinition de méthode Les méthodes hérités peuvent être réécrites dans la classe fille  class voiture extends vehicule { public $marque= « peugeot »; function klaxonne() { //code qui fait klaxonner la voiture } function avance() { //code qui fait avancer la voiture } function freine() { //code qui fait freiner la voiture } }
Héritage strict Les méthodes de la classe fille doivent avoir des prototypes compatibles avec ceux de la classe mère Les classes filles doivent pouvoir se manipuler comme la classe dont elles héritent  Il est possible d'ajouter des paramètres supplémentaires, à condition qu'ils soient facultatifs  Il est aussi possible de rendre facultatifs des paramètres en leur donnant une valeur par défaut  Seuls les constructeurs ne sont pas soumis à cette règles.
Accéder à la classe parente class vehicule { $roues = 4; function affiche() { return &quot;a &quot;.$this->roues.&quot; roues&quot;; } } class voiture extends vehicule { function affiche() { echo &quot;cette voiture &quot;.parent::affiche(); } } $v = new voiture(); $v->affiche(); //affiche cette voiture a 4 roues
Contrôle d’accès public: une méthode ou attribut publique est accessible depuis toute votre application  private: une méthode ou attribut privée n’est accessible que depuis l’intérieur de la classe Protected: une méthode ou attribut publique est accessible depuis l’intérieur de la classe, et depuis toutes les classes dérivés
Contrôle d’accès héritage Les accès aux attributs et méthodes sont redéfinissables dans les classes filles pourvu que la directive soit identique ou plus large Une méthode protégée peut être redéfinie comme protégée ou publique dans une classe fille.  Une méthode publique ne peut être que publique dans un classe fille. Si une méthode privée est redéfinie dans une classe fille, PHP considèrera qu'il a deux méthodes de même nom simultanément dans la classe fille.  Si c'est une méthode de la classe mère qui y fait appel, elle accèdera à la méthode privée initiale.  Si c'est une méthode de la classe fille qui y fait appel, elle accèdera à la nouvelle implémentation.
Classe abstraite début d'implémentation d'une classe Non instanciable Toute classe contenant au moins une méthode abstraite doit être déclarée abstraite Seule la signature d’une méthode abstraite est déclarée (pas d’implémentation) Les classes dérivées doivent implémentées toutes les méthodes abstraites Les classes dérivées ne sont pas obligées d’implémenter les méthodes déjà implémentées dans la classe parent, et peuvent posséder leurs propres méthodes
Classe abstraite abstract class vehicule { abstract function avancer(); function tourner($sens) { echo &quot;tourne à &quot;.$sens.&quot;<br />&quot;; } }
Héritage d’une classe abstraite class voiture extends vehicule { function avancer()   { echo &quot;go!<br />&quot;; } function klaxonner()   { echo &quot;tut tut!<br />&quot;;   } }
interface API (Application Programming Interface) qui spécifie quelles méthodes et variables une classe peut implémenter, sans avoir à définir comment ces méthodes seront gérées  Non instanciable Seule les signatures des méthodes d’une interface sont déclarées (pas d’implémentation) Toutes les méthodes de l'interface doivent être implémentées  Les classes peuvent implémenter plus d'une interface en séparant chaque interface par une virgule
interface interface peutAvancer { public function avancer(); public function freiner(); } interface peutTourner { public function tourneGauche(); public function tourneDroite(); }
Implémentation d’une interface class voiture implements peutAvancer, peutTourner { public function avance() { echo &quot;on avance&quot;; } public function freine() {     echo &quot;on freine&quot;; } public function tourneGauche() {     echo &quot;on tourne à gauche&quot;; } public function tourneDroite() {     echo &quot;on tourne à droite&quot;; } function klaxonner() {    echo &quot;tut tut!<br />&quot;; }  }
Abstract VS interface Aucun code n’est présent dans une interface Une interface est donc une classe abstraite qui ne contiendrait que des méthodes abstraites Une classe ne peut dériver que d’une classe abstraite mais peut implémenter plusieurs interfaces
Classe finale Ces classes et méthodes ne pourront jamais être héritées class voiture extends vehicule { final function avancer() { echo &quot;on avance&quot;; } } final class voiture extends vehicule { public function avancer() { echo &quot;on avance&quot;; } }
déréférencement des méthodes class pneu { public $marque = &quot;michelin&quot;; } class voiture { function Pneu() { return new pneu(); } } $MaVoiture = new voiture(); echo &quot;je roule avec des pneus &quot;.$MaVoiture->Pneu()->$marque;  // affiche &quot;je roule avec des pneus michelin&quot;
affectation en PHP4 par défaut les objets étaient passés par copie  class voiture { public $marque = &quot;trabant&quot;; } $MaVoiture = new voiture(); $MaVoiture2 = $MaVoiture; $MaVoiture2->marque = 'ferrari'; echo $MaVoiture->marque; // affiche &quot;trabant&quot; $MaVoiture et $MaVoiture2 sont des objets distincts.
Affectation par référence en PHP4 On pouvait toutefois forcer l'affectation par référence grâce à l'opérateur &.  class voiture { public $marque = &quot;trabant&quot;; } $MaVoiture = new voiture(); $MaVoiture2 = &$MaVoiture; $MaVoiture2->marque = 'ferrari'; echo $MaVoiture->marque; // affiche &quot;ferrari&quot; pour q'une fonction puisse modifier un objet il fallait donc obligatoirment lui passe l'objet par référence :-/
Affectation en PHP5 par défaut l'affectation est désormais faite pas référence pour les objets (l'opérateur & est maintenant implicite)  class voiture {    public $marque = &quot;trabant&quot;; } $MaVoiture = new voiture(); $MaVoiture2 = $MaVoiture; $MaVoiture2->marque = 'ferrari'; echo $MaVoiture->marque; // affiche &quot;ferrari&quot;
clonage en PHP5 c'est le mot-clé clone qui permet d'effectuer une copie distinct d’un objet class voiture { public $marque = &quot;trabant&quot;; } $MaVoiture = new voiture(); $MaVoiture2 = clone $MaVoiture; $MaVoiture2->marque = 'ferrari'; echo $MaVoiture->marque; // affiche &quot;trabant&quot;
égalité l'égalité de deux objets (tous les attributs sont égaux) se teste par ==  l'identité de deux objets (les deux variables référencent le même objet) se teste par ===
Appartenance d’un objet à une classe class voiture{} $MaVoiture = new voiture(); if($MaVoiture instanceof voiture) { echo &quot;cet objet est une voiture&quot;; } Else { echo &quot;cet objet n'est pas une voiture&quot;; }
obtenir la classe d’un objet class voiture{} $MaVoiture = new voiture(); echo &quot;cet objet est une &quot; . get_class($MaVoiture);  // affiche &quot;cet objet est une voiture&quot;
Obtenir la classe parente d’un objet class vehicule{} class voiture extends vehicule{} $MaVoiture = new voiture(); echo get_class_parent($MaVoiture);  // affiche &quot;vehicule&quot;   echo get_class_parent('voiture');  // affiche &quot;vehicule&quot;
Réflexion PHP 5 introduit API de réflexion complète qui permet de faire du  reverse-engineering  sur les classes, les interfaces, les fonctions et les méthodes tout comme les extensions. L'API de réflexion permet également d'obtenir les commentaires de la documentation pour les fonctions, les classes et les méthodes.  http://fr2.php.net/manual/fr/book.reflection.php
PHP 5.3 Extension SPL (Standard PHP Library) intégrée en natif  http://www.php.net/~helly/php/ext/spl/ Les namespaces sont supportés \ comme caractère séparateur http://fr.php.net/manual/fr/language.namespaces.rationale.php http://jcrozier.developpez.com/tutoriels/web/php/espaces-noms--mots-cles-autoloading/
Fonctions Anonymes ou lambdas Comme en javascript (« à la jQuery ») Affectation à une variable $hello = funtcion(){echo 'hello world'} Appel $hello(); call_user_func($hello); Passé en argument d'une fonction Function foo(Closure $func){$func();} foo($hello); http://blog.pascal-martin.fr/post/php-5.3-1-closures-et-lambdas http://blog.pascal-martin.fr/post/php-5.3-2-closures-et-lambdas http://www.slideshare.net/fabpot/playing-with-php-53

Contenu connexe

PPTX
php2 : formulaire-session-PDO
PDF
Cours php & Mysql - 4éme partie
PPTX
Introduction au Jquery
PDF
Programmation orientée objet en PHP 5
PDF
Programmation Orientée Objet et les Traits en PHP 5.4
PDF
Cours php & Mysql - 2éme partie
PPTX
La première partie de la présentation PHP
PPT
Php mysql cours
 
php2 : formulaire-session-PDO
Cours php & Mysql - 4éme partie
Introduction au Jquery
Programmation orientée objet en PHP 5
Programmation Orientée Objet et les Traits en PHP 5.4
Cours php & Mysql - 2éme partie
La première partie de la présentation PHP
Php mysql cours
 

Tendances (16)

PDF
Php 2 - Approfondissement MySQL, PDO et MVC
KEY
Exploiter php 5
PPT
.php1 : les fondamentaux du PHP
PDF
Notions de base de JavaScript
PDF
Bases de PHP - Partie 1
PDF
SQL et MySQL
PPTX
Introduction à jQuery
PPTX
Symfony2 - Un Framework PHP 5 Performant
PPTX
Introduction à React
PDF
Trucs et astuces PHP et MySQL
PPT
Introduction à JavaScript
PPTX
Cpp2 : classes et objets
PPT
PHP - fonctions mysql
PPTX
Requêtes HTTP synchrones et asynchrones
PDF
Les structures de données PHP5
PPTX
Introduction à ajax
Php 2 - Approfondissement MySQL, PDO et MVC
Exploiter php 5
.php1 : les fondamentaux du PHP
Notions de base de JavaScript
Bases de PHP - Partie 1
SQL et MySQL
Introduction à jQuery
Symfony2 - Un Framework PHP 5 Performant
Introduction à React
Trucs et astuces PHP et MySQL
Introduction à JavaScript
Cpp2 : classes et objets
PHP - fonctions mysql
Requêtes HTTP synchrones et asynchrones
Les structures de données PHP5
Introduction à ajax
Publicité

En vedette (20)

PDF
Object Oriented Programming with PHP 5 - More OOP
DOCX
Court terme 3 edds 4545
PPT
2010 03 05 Powerpoint Apc
PPT
Fa mes dun mes
PDF
Mod 5
ODP
Postales verano candela
ODP
Licences et culture libre
PPT
Mod4virtual
PPT
E twinningový maraton
PPT
Presentacion sanluisfinal[1]
PPT
Networking 2.0 para emprendedores.
PPTX
Midi Languedoc
PPT
Mamadou Bamba: Exemple d’écologie traditionnelle de conservation de certaines...
PDF
Perfectionnement anglais
PPT
Le mariage
PPT
Cellule Synthetique
DOCX
Crisis de valores tradicionales
PDF
Email Retargeting
PDF
Cs la evolución de los reinos cristianos en la Edad Media
PPTX
Object Oriented Programming with PHP 5 - More OOP
Court terme 3 edds 4545
2010 03 05 Powerpoint Apc
Fa mes dun mes
Mod 5
Postales verano candela
Licences et culture libre
Mod4virtual
E twinningový maraton
Presentacion sanluisfinal[1]
Networking 2.0 para emprendedores.
Midi Languedoc
Mamadou Bamba: Exemple d’écologie traditionnelle de conservation de certaines...
Perfectionnement anglais
Le mariage
Cellule Synthetique
Crisis de valores tradicionales
Email Retargeting
Cs la evolución de los reinos cristianos en la Edad Media
Publicité

Similaire à PHP5 - POO (20)

PDF
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
PPTX
PHP_S4.pptx
ODP
Patterns and OOP in PHP
PPTX
S2-02-PHP-objet.pptx
DOCX
test doc
ODP
Migration PHP4-PHP5
PPT
PHP5 et Zend Framework
PDF
Playing With PHP 5.3
PPT
PHP 5.3, PHP Next
PDF
PHP 5 pour les développeurs Java
PDF
Java - implémentation des concepts objets
PPTX
Ch4HeritageSMI2015_2016.pptx
PDF
A la recherche du code mort
PDF
Open close principle, on a dit étendre, pas extends !
PPTX
Cours5-heritage.pptx
ODP
Formation PHP avancé - Cake PHP
PPTX
Cpp3 : heritage
PPTX
Chap III - Heritage et Polymorphisme.pptx
PPTX
Php 5.3
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
PHP_S4.pptx
Patterns and OOP in PHP
S2-02-PHP-objet.pptx
test doc
Migration PHP4-PHP5
PHP5 et Zend Framework
Playing With PHP 5.3
PHP 5.3, PHP Next
PHP 5 pour les développeurs Java
Java - implémentation des concepts objets
Ch4HeritageSMI2015_2016.pptx
A la recherche du code mort
Open close principle, on a dit étendre, pas extends !
Cours5-heritage.pptx
Formation PHP avancé - Cake PHP
Cpp3 : heritage
Chap III - Heritage et Polymorphisme.pptx
Php 5.3

PHP5 - POO

  • 2. Déclarer une classe en PHP Une classe est un modèle de données famille d'objets, ou encore moule à objets tous les objets d’une même classe partagent les mêmes attributs et les mêmes méthodes le mot clé class permet de déclarer une classe d'objet. class voiture { //code de la classe }
  • 3. déclarer des attributs (ou propriétés) class voiture { public $marque = &quot;trabant&quot;; } public, protected, private sont supportés L’un des trois est obligatoire ou le mot clé var (  public) Affectation et même déclaration facultatives!!
  • 4. déclarer des méthodes (ou propriétés) class voiture { function freiner($force_de_freinage) { //code qui freine } } public, protected, private sont supportés Implicitement « public »
  • 5. déclarer des constantes class voiture { const ROUES_MOTRICES = 2; } Locale à la classe convention classique : spécifier les constantes en majuscules dans le code pour mieux les identifier
  • 6. Instanciation class voiture { const ROUES_MOTRICES = 2; public $marque; function freiner($force_de_freinage) { //code qui freine } } $MaVoiture = new voiture(); Les parenthèses sont optionnelles si le constructeur ne nécessite pas de paramètre En PHP5 toute classe doit être déclarée avant d'être utilisée Non obligatoire en PHP4
  • 7. Accéder à un attribut class voiture { public $marque = &quot;trabant&quot;; } $MaVoiture = new voiture(); echo $MaVoiture->marque; // affiche trabant
  • 8. Accéder à une méthode class voiture { function klaxonner() { return &quot;tut tut!!&quot;; } } $MaVoiture = new voiture(); echo $MaVoiture->klaxonner(); // affiche &quot;tut tut!&quot;
  • 9. Accèder à une constante class voiture { const ROUES = 2; public $marque; function freiner($force_de_freinage) { //code qui freine } } $MaVoiture = new voiture(); echo &quot;ma voiture a &quot;.$MaVoiture::ROUES.&quot; roues &quot;; // affiche &quot;ma voiture a 2 roues&quot;
  • 10. référence à l'objet en cours class voiture { public $vitesse = 0; function avance( $temps) { echo &quot;avance de &quot;.$temps*$this->vitesse.&quot; km en &quot;.$temps.&quot; h&quot;; } } $MaVoiture = new voiture(); $MaVoiture->vitesse = 100; //la vitesse est de 100km/h $MaVoiture->avance(2); // affiche &quot;avance de 200 km en 2h&quot;
  • 11. accès statiques appel direct via la classe, pas d’instanciaton utilisant de l’accesseur :: La référence à l’objet courant $this est alors interdite class voiture { public $roues = 4; function statique() { return 4; } function dynamique() { return $this->roues; } } echo voiture::$roues; // affiche un message d’erreur echo voiture::statique(); // affiche 4 echo voiture::dynamique(); // affiche un message d'erreur
  • 12. Accès statique explicite Via le mot clé static Pour les attributs public private ou protected devient facultatif (public par défaut) class voiture { static $roues = 4 static function statique() { echo 4; } } echo voiture::$roues; // affiche 4 echo voiture::statique(); // affiche 4 $v = new voiture(); echo $v->roues; // affiche un message d'erreur echo $v->statique(); //affiche 4 et est sensé afficher un message d'erreur de niveau E_STRICT
  • 13. Accès à la classe courante class voiture { static $roues = 4; function static() { return self::$roues; } } echo voiture::static(); // CORRECT affiche 4 $v = new voiture(); echo $v->dynamique().&quot;<br />&quot;; //INCORRECT mais affiche 4 et est sensé afficher un message d'erreur de niveau E_STRICT
  • 14. Exception <?php function inverse($x) { if (!$x) { throw new Exception('Division by zero.'); } else return 1/$x; } try { echo inverse(5) . &quot;\n&quot;; echo inverse(0) . &quot;\n&quot;; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), &quot;\n&quot;; }
  • 15. L’héritage en POO permet de regrouper des parties communes dans une classe dite mère Toute classe dérivant de cette classe mère est appelée classe fille Une classe fille possède les attributs et méthodes de la classe mère ainsi que des attributs et des méthodes qui lui sont propres Pas d’héritage multiple en PHP5
  • 16. Héritage en PHP5 class vehicule { public $marque = &quot;&quot;; function avance() { //code qui fait avancer le véhicule } function freine() { //code qui fait freiner le vehicule } } class voiture extends vehicule { function klaxonne() { //code qui fait klaxonner la voiture } // la classe voiture possède un attribut marque, une méthode freine et une méthode avance par héritage }
  • 17. Redéfinition de méthode Les méthodes hérités peuvent être réécrites dans la classe fille class voiture extends vehicule { public $marque= « peugeot »; function klaxonne() { //code qui fait klaxonner la voiture } function avance() { //code qui fait avancer la voiture } function freine() { //code qui fait freiner la voiture } }
  • 18. Héritage strict Les méthodes de la classe fille doivent avoir des prototypes compatibles avec ceux de la classe mère Les classes filles doivent pouvoir se manipuler comme la classe dont elles héritent Il est possible d'ajouter des paramètres supplémentaires, à condition qu'ils soient facultatifs Il est aussi possible de rendre facultatifs des paramètres en leur donnant une valeur par défaut Seuls les constructeurs ne sont pas soumis à cette règles.
  • 19. Accéder à la classe parente class vehicule { $roues = 4; function affiche() { return &quot;a &quot;.$this->roues.&quot; roues&quot;; } } class voiture extends vehicule { function affiche() { echo &quot;cette voiture &quot;.parent::affiche(); } } $v = new voiture(); $v->affiche(); //affiche cette voiture a 4 roues
  • 20. Contrôle d’accès public: une méthode ou attribut publique est accessible depuis toute votre application private: une méthode ou attribut privée n’est accessible que depuis l’intérieur de la classe Protected: une méthode ou attribut publique est accessible depuis l’intérieur de la classe, et depuis toutes les classes dérivés
  • 21. Contrôle d’accès héritage Les accès aux attributs et méthodes sont redéfinissables dans les classes filles pourvu que la directive soit identique ou plus large Une méthode protégée peut être redéfinie comme protégée ou publique dans une classe fille. Une méthode publique ne peut être que publique dans un classe fille. Si une méthode privée est redéfinie dans une classe fille, PHP considèrera qu'il a deux méthodes de même nom simultanément dans la classe fille. Si c'est une méthode de la classe mère qui y fait appel, elle accèdera à la méthode privée initiale. Si c'est une méthode de la classe fille qui y fait appel, elle accèdera à la nouvelle implémentation.
  • 22. Classe abstraite début d'implémentation d'une classe Non instanciable Toute classe contenant au moins une méthode abstraite doit être déclarée abstraite Seule la signature d’une méthode abstraite est déclarée (pas d’implémentation) Les classes dérivées doivent implémentées toutes les méthodes abstraites Les classes dérivées ne sont pas obligées d’implémenter les méthodes déjà implémentées dans la classe parent, et peuvent posséder leurs propres méthodes
  • 23. Classe abstraite abstract class vehicule { abstract function avancer(); function tourner($sens) { echo &quot;tourne à &quot;.$sens.&quot;<br />&quot;; } }
  • 24. Héritage d’une classe abstraite class voiture extends vehicule { function avancer() { echo &quot;go!<br />&quot;; } function klaxonner() { echo &quot;tut tut!<br />&quot;; } }
  • 25. interface API (Application Programming Interface) qui spécifie quelles méthodes et variables une classe peut implémenter, sans avoir à définir comment ces méthodes seront gérées Non instanciable Seule les signatures des méthodes d’une interface sont déclarées (pas d’implémentation) Toutes les méthodes de l'interface doivent être implémentées Les classes peuvent implémenter plus d'une interface en séparant chaque interface par une virgule
  • 26. interface interface peutAvancer { public function avancer(); public function freiner(); } interface peutTourner { public function tourneGauche(); public function tourneDroite(); }
  • 27. Implémentation d’une interface class voiture implements peutAvancer, peutTourner { public function avance() { echo &quot;on avance&quot;; } public function freine() {     echo &quot;on freine&quot;; } public function tourneGauche() {     echo &quot;on tourne à gauche&quot;; } public function tourneDroite() {     echo &quot;on tourne à droite&quot;; } function klaxonner() {    echo &quot;tut tut!<br />&quot;; } }
  • 28. Abstract VS interface Aucun code n’est présent dans une interface Une interface est donc une classe abstraite qui ne contiendrait que des méthodes abstraites Une classe ne peut dériver que d’une classe abstraite mais peut implémenter plusieurs interfaces
  • 29. Classe finale Ces classes et méthodes ne pourront jamais être héritées class voiture extends vehicule { final function avancer() { echo &quot;on avance&quot;; } } final class voiture extends vehicule { public function avancer() { echo &quot;on avance&quot;; } }
  • 30. déréférencement des méthodes class pneu { public $marque = &quot;michelin&quot;; } class voiture { function Pneu() { return new pneu(); } } $MaVoiture = new voiture(); echo &quot;je roule avec des pneus &quot;.$MaVoiture->Pneu()->$marque; // affiche &quot;je roule avec des pneus michelin&quot;
  • 31. affectation en PHP4 par défaut les objets étaient passés par copie class voiture { public $marque = &quot;trabant&quot;; } $MaVoiture = new voiture(); $MaVoiture2 = $MaVoiture; $MaVoiture2->marque = 'ferrari'; echo $MaVoiture->marque; // affiche &quot;trabant&quot; $MaVoiture et $MaVoiture2 sont des objets distincts.
  • 32. Affectation par référence en PHP4 On pouvait toutefois forcer l'affectation par référence grâce à l'opérateur &. class voiture { public $marque = &quot;trabant&quot;; } $MaVoiture = new voiture(); $MaVoiture2 = &$MaVoiture; $MaVoiture2->marque = 'ferrari'; echo $MaVoiture->marque; // affiche &quot;ferrari&quot; pour q'une fonction puisse modifier un objet il fallait donc obligatoirment lui passe l'objet par référence :-/
  • 33. Affectation en PHP5 par défaut l'affectation est désormais faite pas référence pour les objets (l'opérateur & est maintenant implicite) class voiture {    public $marque = &quot;trabant&quot;; } $MaVoiture = new voiture(); $MaVoiture2 = $MaVoiture; $MaVoiture2->marque = 'ferrari'; echo $MaVoiture->marque; // affiche &quot;ferrari&quot;
  • 34. clonage en PHP5 c'est le mot-clé clone qui permet d'effectuer une copie distinct d’un objet class voiture { public $marque = &quot;trabant&quot;; } $MaVoiture = new voiture(); $MaVoiture2 = clone $MaVoiture; $MaVoiture2->marque = 'ferrari'; echo $MaVoiture->marque; // affiche &quot;trabant&quot;
  • 35. égalité l'égalité de deux objets (tous les attributs sont égaux) se teste par == l'identité de deux objets (les deux variables référencent le même objet) se teste par ===
  • 36. Appartenance d’un objet à une classe class voiture{} $MaVoiture = new voiture(); if($MaVoiture instanceof voiture) { echo &quot;cet objet est une voiture&quot;; } Else { echo &quot;cet objet n'est pas une voiture&quot;; }
  • 37. obtenir la classe d’un objet class voiture{} $MaVoiture = new voiture(); echo &quot;cet objet est une &quot; . get_class($MaVoiture); // affiche &quot;cet objet est une voiture&quot;
  • 38. Obtenir la classe parente d’un objet class vehicule{} class voiture extends vehicule{} $MaVoiture = new voiture(); echo get_class_parent($MaVoiture); // affiche &quot;vehicule&quot;   echo get_class_parent('voiture'); // affiche &quot;vehicule&quot;
  • 39. Réflexion PHP 5 introduit API de réflexion complète qui permet de faire du reverse-engineering sur les classes, les interfaces, les fonctions et les méthodes tout comme les extensions. L'API de réflexion permet également d'obtenir les commentaires de la documentation pour les fonctions, les classes et les méthodes. http://fr2.php.net/manual/fr/book.reflection.php
  • 40. PHP 5.3 Extension SPL (Standard PHP Library) intégrée en natif http://www.php.net/~helly/php/ext/spl/ Les namespaces sont supportés \ comme caractère séparateur http://fr.php.net/manual/fr/language.namespaces.rationale.php http://jcrozier.developpez.com/tutoriels/web/php/espaces-noms--mots-cles-autoloading/
  • 41. Fonctions Anonymes ou lambdas Comme en javascript (« à la jQuery ») Affectation à une variable $hello = funtcion(){echo 'hello world'} Appel $hello(); call_user_func($hello); Passé en argument d'une fonction Function foo(Closure $func){$func();} foo($hello); http://blog.pascal-martin.fr/post/php-5.3-1-closures-et-lambdas http://blog.pascal-martin.fr/post/php-5.3-2-closures-et-lambdas http://www.slideshare.net/fabpot/playing-with-php-53

Notes de l'éditeur

  • #19: Pour résumer le nombre de paramètres obligatoires de la méthode fille doit être inférieur ou égal au nombre de paramètres possibles de la méthode mère; le nombre de paramètres possibles de la méthode fille doit quant à lui être supérieur ou égal au nombre de paramètres possibles de la méthode mère.