36
23:47:01 23:47:01 Programmation Web 2012-2013 Programmation Web 2012-2013 1 PHP5 objet "avancé" PHP5 objet "avancé" Jérôme CUTRONA Jérôme CUTRONA [email protected] [email protected]

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

Embed Size (px)

Citation preview

Page 1: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

03:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013 11

PHP5 objet "avancé"PHP5 objet "avancé"

Jérôme CUTRONAJérôme CUTRONA

[email protected]@univ-reims.fr

Page 2: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

2203:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

Autochargement de classes Autochargement de classes __autoload__autoload

Appelée si une Appelée si une classeclasse n'est n'est pas encore définiepas encore définie au moment de son utilisationau moment de son utilisation

Dernière chance pour Dernière chance pour inclure automatiquementinclure automatiquement une définition de classeune définition de classe

Besoin d’une Besoin d’une règle claire règle claire entre le entre le nom de classe nom de classe et le et le nom du fichiernom du fichier contenant sa définition contenant sa définition

functionfunction __autoload(__autoload($$class_nameclass_name)) {{ require_oncerequire_once $$class_nameclass_name .. ' '.class.php.class.php'';;}}$$aa == newnew Cercle Cercle()() ;;

require_oncerequire_once ' 'Cercle.class.phpCercle.class.php'';;

Page 3: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

3303:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

Méthodes "magiques"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()

Page 4: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

4403:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

__construct, __destruct__construct, __destruct

__construct__construct Constructeur de l'objetConstructeur de l'objet Appelé lors de l'utilisation de Appelé lors de l'utilisation de newnew $$cc == newnew Point Point((1010, , -12-12)) ; ;

__destruct__destruct Destructeur de l'objetDestructeur de l'objet Appelé lorsque la dernière référence sur un objet est Appelé lorsque la dernière référence sur un objet est

perdueperdue $$cc == newnew Point Point((1010, , -12-12)) ; ;$$cc = = nullnull ; ;

Page 5: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

5503:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

__toString__toString

Permet de décrire le comportement de la classe Permet de décrire le comportement de la classe lorsqu'une instance est convertie en chaînelorsqu'une instance est convertie en chaîne

Avant PHP 5.2, Avant PHP 5.2, __toString__toString n'est appelée que n'est appelée que lors d'une combinaison directe avec lors d'une combinaison directe avec echoecho ou ou printprint

$$aa == newnew Affichable Affichable((''BonjourBonjour''));;echoecho $$aa ;;

Page 6: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

6603:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

__toString__toString

classclass Affichable Affichable { { // en PHP 5.1.2// en PHP 5.1.2

publicpublic $$dd;;

publicpublic functionfunction __construct(__construct($$_d_d))

{{ $$thisthis->->d d == $$_d_d;; }}

publicpublic functionfunction __toString()__toString()

{{ returnreturn $$thisthis->->dd;; }}

}}

$$aa == newnew Affichable Affichable((''BonjourBonjour''));;

echoecho $$aa ;;

echoecho " "Mon objet affichable :Mon objet affichable :"".$.$aa..""\n\n" " ;;

echoecho " "Mon objet affichable :Mon objet affichable :$$aa\n\n" " ;;

BonjourBonjour

Mon objet affichable :Object id #1Mon objet affichable :Object id #1

Mon objet affichable :Object id #1Mon objet affichable :Object id #1

Page 7: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

7703:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

__clone__clone

Permet de décrire le comportement de la classe Permet de décrire le comportement de la classe lorsqu'une lorsqu'une instanceinstance est est clonéeclonée

$$objet2objet2 == cloneclone $$objet1objet1 ; ; Clonage par défaut : Clonage par défaut : copie des propriétéscopie 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 classecompteur d'instances d'une classe

Ne peut Ne peut PASPAS être être appelée directementappelée directement Intervient Intervient après la copie superficielle (=)après la copie superficielle (=) Ne Ne concerneconcerne que que l'objetl'objet clonécloné (identiques) (identiques)

Page 8: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

classclass A A {{ } } classclass B B {{ }}

classclass Z Z {{

protectedprotected $$aa ;;

protectedprotected $$bb ;;

publicpublic functionfunction __construct()__construct() {{

$$thisthis->->a a == newnew A A()() ;;

$$thisthis->->b b == newnew B B()() ;; }}

}}

$$z1z1 == newnew Z Z()() ;;

var_dumpvar_dump(($$z1z1)) ;;

$$z2z2 == cloneclone $$z1z1 ;;

var_dumpvar_dump(($$z2z2)) ;; 8803:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

__clone__clone

object(Z)object(Z)#1#1 (2) { (2) {

["a:protected"]=> object(A)["a:protected"]=> object(A)#2#2 (0) { } (0) { }

["b:protected"]=> object(B)["b:protected"]=> object(B)#3#3 (0) { } (0) { }

}}

object(Z)object(Z)#4#4 (2) { (2) {

["a:protected"]=> object(A)["a:protected"]=> object(A)#2#2 (0) { } (0) { }

["b:protected"]=> object(B)["b:protected"]=> object(B)#3#3 (0) { } (0) { }

} }

Page 9: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

classclass A A {{ } } classclass B B {{ }}

classclass Z Z {{

protectedprotected $$aa ;;

protectedprotected $$bb ;;

publicpublic functionfunction __construct()__construct() {{

$$thisthis->->a a == newnew A A()() ;;

$$thisthis->->b b == newnew B B()() ;; }}

}}

$$z1z1 == newnew Z Z()() ;;

$$z2z2 == cloneclone $$z1z1 ;;

9903:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

__clone__clone

ZZ

$$aa

$$bb

$$z1z1AA

BB

ZZ

$$aa

$$bb

$$z2z2

Clonage de l'objet Z :Clonage de l'objet Z :duplication de l'objet par duplication de l'objet par copie superficiellecopie superficielle des des attributs (simple =)attributs (simple =)

Page 10: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

classclass A A {{ } } classclass B B {{ }}

classclass Z Z {{

protectedprotected $$aa ;;

protectedprotected $$bb ;;

publicpublic functionfunction __construct()__construct() {{

$$thisthis->->a a == newnew A A()() ;;

$$thisthis->->b b == newnew B B()() ;; }}

publicpublic functionfunction __clone()__clone() {{

$$thisthis->->a a == cloneclone $$thisthis->->a a ;; }}

}}

$$z1z1 == newnew Z Z()() ;;

var_dumpvar_dump(($$z1z1)) ;;

$$z2z2 == cloneclone $$z1z1 ;;

var_dumpvar_dump(($$z2z2)) ;; 101003:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

__clone__clone

object(Z)object(Z)#1#1 (2) { (2) {

["a:protected"]=> object(A)["a:protected"]=> object(A)#2#2 (0) { } (0) { }

["b:protected"]=> object(B)["b:protected"]=> object(B)#3#3 (0) { } (0) { }

}}

object(Z)object(Z)#4#4 (2) { (2) {

["a:protected"]=> object(A)["a:protected"]=> object(A)#5#5 (0) { } (0) { }

["b:protected"]=> object(B)["b:protected"]=> object(B)#3#3 (0) { } (0) { }

} }

Page 11: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

classclass A A {{ } } classclass B B {{ }}

classclass Z Z {{

protectedprotected $$aa ;;

protectedprotected $$bb ;;

publicpublic functionfunction __construct()__construct() {{

$$thisthis->->a a == newnew A A()() ;;

$$thisthis->->b b == newnew B B()() ;; }}

publicpublic functionfunction __clone()__clone() {{

$$thisthis->->a a == cloneclone $$thisthis->->a a ;; }}

}}

$$z1z1 == newnew Z Z()() ;;

$$z2z2 == cloneclone $$z1z1 ;;

111103:24:5103:24:51 Programmation Web 2012-2013Programmation Web 2012-2013

__clone__clone

ZZ

$$aa

$$bb

$$z1z1

AA

BB

ZZ

$$aa

$$bb

$$z2z2

Clonage de l'objet Z :Clonage de l'objet Z :duplication de l'objet par duplication de l'objet par copie superficiellecopie superficielle des des attributs (simple =)attributs (simple =)

AA

Page 12: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

121203:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__get, __set__get, __set

Permet de Permet de surcharger l'accès à des donnéessurcharger l'accès à des données membres membres inaccessiblesinaccessibles d'une classe en lecture d'une classe en lecture ((__get__get) et en écriture () et en écriture (__set__set))

Ne sont Ne sont déclenchéesdéclenchées que que sisi la propriétéla propriété demandée demandée n'est pas accessiblen'est pas accessible (private, (private, protected ou inexistante)protected ou inexistante)

Les méthodes ne doivent Les méthodes ne doivent PASPAS être être staticstatic Les méthodes surchargées doivent être Les méthodes surchargées doivent être publicpublic Permet de donner un Permet de donner un accès simplifiéaccès simplifié à des à des

propriétés non accessibles directementpropriétés non accessibles directement Permet éventuellement d'effectuer des Permet éventuellement d'effectuer des contrôlescontrôles

Page 13: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

131303:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__get, __set__get, __set

classclass Point Point {{

privateprivate $$coordcoord ;;

publicpublic functionfunction __construct(__construct($$_x_x, , $$_y_y)) {{

ifif ((!!is_numericis_numeric(($$_x_x)) |||| !!is_numericis_numeric(($$_y_y)))) {{

throwthrow newnew ExceptionException((

""Paramètres non numériques (Paramètres non numériques ($$_x_x, , $$_y_y))"")) ;;

}}

$$thisthis->->coordcoord[[''xx'']] == $$_x_x ;;

$$thisthis->->coordcoord[[''yy'']] == $$_y_y ;;

}}

……

$$pp == newnew Point Point((11, , 1212)) ;;

Page 14: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

141403:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__get__get

publicpublic functionfunction __get(__get($$_prop_prop)) {{

ifif ((!!array_key_existsarray_key_exists(($$_prop_prop, , $$thisthis->->coordcoord)))) { {

throwthrow newnew ExceptionException((

""Accès à une propriété inconnue (Accès à une propriété inconnue ($$_prop_prop))"")) ;;

}}

returnreturn $$thisthis->->coordcoord[[$$_prop_prop]] ;;

}}

……

echoecho " "p: (p: ({{$$pp->->xx}}, , {{$$pp->->yy}}))\n\n" " ;;echoecho " "p: (p: ({{$$pp->->zz}}, , {{$$pp->->tt}}))\n\n" " ;;

p: (1, 12) p: (1, 12) Fatal error: Uncaught exception 'Exception' with message 'Accès à une Fatal error: Uncaught exception 'Exception' with message 'Accès à une propriété inconnue (z)' in surcharge.php:19propriété inconnue (z)' in surcharge.php:19Stack trace: #0 surcharge.php(37): Point->__get('z')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

Page 15: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

151503:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__set__set

publicpublic functionfunction __set(__set($$_prop_prop, , $$_val_val)) {{

ifif ((!!is_numericis_numeric(($$_val_val)))) {{

throwthrow newnew ExceptionException((

""Valeur non numérique (Valeur non numérique ($$_val_val))"")) ;;

}}

ifif ((!!array_key_existsarray_key_exists(($$_prop_prop, , $$thisthis->->coordcoord)))) {{

throwthrow newnew ExceptionException((

""Accès à une propriété inconnue (Accès à une propriété inconnue ($$_prop_prop))"")) ;;

}}

returnreturn $$thisthis->->coordcoord[[$$_prop_prop]] == $$_val_val ;;

}}

}} $$pp->->x x == -12-12 ;;echoecho " "p: (p: ({{$$pp->->xx}}, , {{$$pp->->yy}}))\n\n" " ;;

p: (-12, 12)p: (-12, 12)

Page 16: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

161603:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__isset, __unset__isset, __unset

Permet de Permet de surcharger l'accèssurcharger l'accès à des à des donnéesdonnées membres inaccessiblesmembres inaccessibles d'une classe par d'une classe par isset()isset()((__isset__isset) et par ) et par unset()unset()((__unset__unset))

Ne sont Ne sont déclenchéesdéclenchées que que sisi la propriétéla propriété demandée demandée n'est pas accessiblen'est pas accessible (private, (private, protected ou inexistante)protected ou inexistante)

Les méthodes ne doivent Les méthodes ne doivent PASPAS être être staticstatic Les méthodes surchargées doivent être Les méthodes surchargées doivent être publicpublic Permet de donner un Permet de donner un accès simplifiéaccès simplifié à des à des

propriétés non accessibles directementpropriétés non accessibles directement Permet éventuellement d'effectuer des Permet éventuellement d'effectuer des contrôlescontrôles

Page 17: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

171703:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__call__call

Permet de Permet de surcharger l'accès à des méthodessurcharger l'accès à des méthodes non accessibles non accessibles d'une classed'une classe

N'est N'est déclenchéedéclenchée que que sisi la méthode la méthode demandée demandée n'est pas accessiblen'est pas accessible (private, protected ou (private, protected ou inexistante)inexistante)

Ne doit Ne doit PASPAS être être staticstatic Doit être Doit être publicpublic Permet de donner un Permet de donner un accès simplifiéaccès simplifié à des à des

méthodes non accessibles directementméthodes non accessibles directement

Page 18: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

181803:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__call__call

classclass Moteur Moteur {{

publicpublic functionfunction demarrer demarrer()() {{ echoecho " "VroummmVroummm\n\n" " ;; }}

publicpublic functionfunction arreter arreter()() {{ echoecho " "......\n\n" " ;; } }} }

classclass Voiture Voiture {{

privateprivate $$moteurmoteur ;;

publicpublic functionfunction __construct()__construct()

{{ $$thisthis->->moteur moteur == newnew Moteur Moteur()() ;; }}

publicpublic functionfunction __call(__call($$_method_method, , $$_params_params)) {{

ifif ((!!method_existsmethod_exists(($$thisthis->->moteur, moteur, $$_method_method))))

throwthrow newnew ExceptionException((

""Méthode inconnue (Méthode inconnue ($$_method_method))"")) ;;

call_user_func_arraycall_user_func_array((arrayarray(($$thisthis->->moteur,moteur,

$$_method_method)),,

$$_params_params)) ; ; } }} }

Page 19: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

191903:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__call__call

$$vv == newnew Voiture Voiture()() ;;

$$vv->->demarrerdemarrer()() ;;

$$vv->->arreterarreter()() ;;

$$vv->->avanceravancer()() ;;

VroummmVroummm

......

Fatal error: Uncaught exception 'Exception' with message Fatal error: Uncaught exception 'Exception' with message 'Méthode inconnue (avancer)' in surcharge.php:61'Méthode inconnue (avancer)' in surcharge.php:61Stack trace: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

Page 20: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

202003:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__callStatic (PHP 5.3)__callStatic (PHP 5.3)

Permet de Permet de surcharger l'accès à des méthodessurcharger l'accès à des méthodes staticstatic non accessibles non accessibles d'une classe d'une classe

N'est N'est déclenchéedéclenchée que que sisi la méthode la méthode demandée demandée n'est pas accessiblen'est pas accessible (private, protected ou (private, protected ou inexistante)inexistante)

Doit être Doit être staticstatic Doit être Doit être publicpublic Permet de donner un Permet de donner un accès simplifiéaccès simplifié à des à des

méthodes non accessibles directementméthodes non accessibles directement

Page 21: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

212103:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__callStatic (PHP 5.3)__callStatic (PHP 5.3)

classclass Moteur Moteur {{

public staticpublic static functionfunction demarrer demarrer()()

{ { echoecho " "VroummmVroummm\n\n" " ;; }}

publicpublic staticstatic functionfunction arreter arreter()()

{ { echoecho " "......\n\n" " ;; }}

}}

classclass Voiture Voiture {{

publicpublic staticstatic functionfunction __callStatic(__callStatic($$_method_method,, $$_params_params){){

ifif ((!!method_existsmethod_exists((""MoteurMoteur", ", $$_method_method))))

throwthrow newnew ExceptionException((

""Méthode statique inconnue (Méthode statique inconnue ($$_method_method))"")) ;;

call_user_func_arraycall_user_func_array((arrayarray((""MoteurMoteur", ", $$_method_method)),,

$$_params_params)) ; ; } }} }

Page 22: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

222203:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

__callStatic (PHP 5.3)__callStatic (PHP 5.3)

VoitureVoiture::::demarrerdemarrer()() ;;

VoitureVoiture::::arreterarreter()() ;;

VoitureVoiture::::avanceravancer()() ;;

VroummmVroummm

......

Fatal error: Uncaught exception 'Exception' with message Fatal error: Uncaught exception 'Exception' with message 'Accès à une méthode statique inconnue (avancer)' in 'Accès à une méthode statique inconnue (avancer)' in callStatic.php on line 8callStatic.php on line 8Call Stack:Call Stack:1. {main}() callStatic.php:01. {main}() callStatic.php:02. Voiture::avancer() callStatic.php:172. Voiture::avancer() callStatic.php:173. Voiture::__callStatic() callStatic.php:0 3. Voiture::__callStatic() callStatic.php:0

Page 23: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

__invoke__invoke

class Traceur class Traceur {{        private private $$_nomFichier _nomFichier = = null ;null ;        private private $$_ressource  _ressource  = = null ;null ;        public public function function __construct__construct(($$fichierfichier) {) {                $$thisthis->_nomFichier ->_nomFichier = $= $fichier ;fichier ;                $$thisthis->_ouvrirFichier->_ouvrirFichier() ;() ;                $$thisthis->ecrire->ecrire('('Fin construction'Fin construction') ;) ;        }}        public public function function __destruct__destruct() {() {                $$thisthis->ecrire->ecrire('('Prêt pour la destruction'Prêt pour la destruction') ;) ;                fclosefclose(($$thisthis->_ressource->_ressource) ;) ;        }}        private private function _ouvrirFichierfunction _ouvrirFichier() {() {                $$thisthis->_ressource  ->_ressource  = = fopenfopen(($$thisthis->_nomFichier, '->_nomFichier, 'a'a') ;) ;        }}        public public function ecrirefunction ecrire(($$textetexte) {) {                $$ligne ligne = = strftimestrftime('('%c'%c') ) . '. ' : '  : ' . $. $texte texte . ". "\n" ;\n" ;                fwritefwrite(($$thisthis->_ressource, ->_ressource, $$ligneligne) ;) ;        }}……

232303:24:5203:24:52 Programmation Web 2012-2013Programmation Web 2012-2013

Page 24: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

__invoke__invoke

……        public public function __invokefunction __invoke(($$textetexte) {) {                $$thisthis->ecrire->ecrire(($$textetexte) ;) ;        }}}}

$$t t = = new Traceurnew Traceur('('log.txt'log.txt') ;) ;

$$tt('('Début'Début') ; ) ; sleepsleep((22) ;) ;$$tt('('Suite'Suite') ; ) ; sleepsleep((33) ;) ;$$tt('('Terminé !'Terminé !') ;) ;

readfilereadfile('('log.txt'log.txt') ;) ;

242403:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Tue Oct 11 00:04:14 2011 : Fin constructionTue Oct 11 00:04:14 2011 : Fin constructionTue Oct 11 00:04:14 2011 : DébutTue Oct 11 00:04:14 2011 : DébutTue Oct 11 00:04:16 2011 : SuiteTue Oct 11 00:04:16 2011 : SuiteTue Oct 11 00:04:19 2011 : Terminé !Tue Oct 11 00:04:19 2011 : Terminé !

Page 25: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

Linéarisation d’objetsLinéarisation d’objets

Stockage d’une variable dans une forme Stockage d’une variable dans une forme « dormante » entre deux scripts« dormante » entre deux scripts

La variable est réduite à une chaîne de La variable est réduite à une chaîne de caractères contenant ses caractéristiquescaractères contenant ses caractéristiques

La délinéarisation permet de retrouver la La délinéarisation permet de retrouver la variable restaurée dans sa forme utilisablevariable restaurée dans sa forme utilisable

Les objets peuvent être (dé)linéarisésLes objets peuvent être (dé)linéarisés Les méthodes de classe posent problèmeLes méthodes de classe posent problème Les attributs de type « ressource » posent Les attributs de type « ressource » posent

problèmeproblème

252503:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Page 26: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

__sleep, __wakeup__sleep, __wakeup

class Traceur class Traceur {{        private private $$_nomFichier _nomFichier = = null ;null ;        private private $$_ressource  _ressource  = = null ;null ;        public public function function __construct__construct(($$fichierfichier) {) {                $$thisthis->_nomFichier ->_nomFichier = $= $fichier ;fichier ;                $$thisthis->_ouvrirFichier->_ouvrirFichier() ;() ;                $$thisthis->ecrire->ecrire('('Fin construction'Fin construction') ;) ;        }}        public public function function __destruct__destruct() {() {                $$thisthis->ecrire->ecrire('('Prêt pour la destruction'Prêt pour la destruction') ;) ;                fclosefclose(($$thisthis->_ressource->_ressource) ;) ;        }}        private private function _ouvrirFichierfunction _ouvrirFichier() {() {                $$thisthis->_ressource  ->_ressource  = = fopenfopen(($$thisthis->_nomFichier, '->_nomFichier, 'a'a') ;) ;        }}        public public function ecrirefunction ecrire(($$textetexte) {) {                $$ligne ligne = = strftimestrftime('('%c'%c') ) . '. ' : '  : ' . $. $texte texte . ". "\n" ;\n" ;                fwritefwrite(($$thisthis->_ressource, ->_ressource, $$ligneligne) ;) ;        }}……

262603:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Type ressource :Type ressource :Ne peut pas être Ne peut pas être

linéarisé !linéarisé !

Page 27: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

__sleep, __wakeup__sleep, __wakeup

……        public public function function __sleep__sleep() {() {                return return arrayarray('('_nomFichier'_nomFichier') ;) ;        }}        public public function function __wakeup__wakeup() {() {                $$thisthis->_ouvrirFichier->_ouvrirFichier() ;() ;                $$thisthis->ecrire->ecrire('('Debout là-dedans !'Debout là-dedans !') ;) ;        }}}}if if ((issetisset(($$_SESSION_SESSION['['TRACEUR'TRACEUR'])) {])) {        $$t t = $= $_SESSION_SESSION['['TRACEUR'TRACEUR'] ;] ;}}else else {{        $$t t = = new Traceurnew Traceur('('log.txt'log.txt') ;) ;}}$$tt('('Début'Début') ; ) ; sleepsleep((22) ;) ;$$tt('('Suite'Suite') ; ) ; sleepsleep((33) ;) ;$$tt('('Terminé !'Terminé !') ;) ;$$_SESSION_SESSION['['TRACEUR'TRACEUR'] ] = $= $t ;t ;readfilereadfile('('log.txt'log.txt') ;) ;

272703:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Tue Oct 11 00:06:52 2011 : Fin constructionTue Oct 11 00:06:52 2011 : Fin constructionTue Oct 11 00:06:53 2011 : DébutTue Oct 11 00:06:53 2011 : DébutTue Oct 11 00:06:55 2011 : SuiteTue Oct 11 00:06:55 2011 : SuiteTue Oct 11 00:06:58 2011 : Terminé !Tue Oct 11 00:06:58 2011 : Terminé !Tue Oct 11 00:06:58 2011 : Prêt pour la destructionTue Oct 11 00:06:58 2011 : Prêt pour la destructionTue Oct 11 00:07:10 2011 : Debout là-dedans !Tue Oct 11 00:07:10 2011 : Debout là-dedans !Tue Oct 11 00:07:10 2011 : DébutTue Oct 11 00:07:10 2011 : DébutTue Oct 11 00:07:12 2011 : SuiteTue Oct 11 00:07:12 2011 : SuiteTue Oct 11 00:07:15 2011 : Terminé !Tue Oct 11 00:07:15 2011 : Terminé !

Page 28: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

282803:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Abstraction de classesAbstraction de classes

Classes et méthodes abstraitesClasses et méthodes abstraites Impossibilité de créer une instance d’une classe Impossibilité de créer une instance d’une classe

abstraiteabstraite Toute classe contenant une méthode abstraite Toute classe contenant une méthode abstraite

doit être définie abstraitedoit être définie abstraite Méthode abstraite : pas d'implémentationMéthode abstraite : pas d'implémentation Implémentation de toutes les méthodes Implémentation de toutes les méthodes

abstraites d'une classe dans la classe dérivéeabstraites d'une classe dans la classe dérivée Méthodes abstraites protégées ou publiquesMéthodes abstraites protégées ou publiques

Page 29: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

292903:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Abstraction de classes : exempleAbstraction de classes : exemple

abstractabstract classclass Abstraite Abstraite {{

abstractabstract protectedprotected functionfunction nom nom()() ; ;

functionfunction affiche affiche()() {{

echoecho " "Mon nom est 'Mon nom est '{{$$thisthis->->nom()nom()}}''" ;" ;

}}

}}

classclass Concrete Concrete extendsextends Abstraite Abstraite {{

protectedprotected functionfunction nom nom()() {{

returnreturn " "ConcreteConcrete" ;" ;

}}

}}

$$aa == newnew Abstraite Abstraite()() ; ;

$$cc == newnew Concrete Concrete()() ; ;

$$cc->->afficheaffiche()() ; ;

Classe abstraiteClasse abstraite

Méthode abstraite Méthode abstraite protégéeprotégée

Concrétisation de la Concrétisation de la classe abstraiteclasse abstraite

Implémentation de la Implémentation de la méthode abstraiteméthode abstraite

Instanciation de la Instanciation de la classe abstraiteclasse abstraite

Instanciation de la Instanciation de la classe concrèteclasse concrète

Fatal error: Fatal error: Cannot instantiate abstract Cannot instantiate abstract class Abstraite inclass Abstraite in dummy.php dummy.php on lineon line 72 72

Mon nom est 'Concrete'Mon nom est 'Concrete'

Page 30: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

303003:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Typage des paramètresTypage des paramètres

Les Les paramètresparamètres des fonctions et méthodes des fonctions et méthodes peuvent être typéspeuvent être typés

Les Les typestypes sont alors forcément des sont alors forcément des types définis types définis par l'utilisateurpar l'utilisateur ou ou des tableauxdes tableaux (PHP 5.1) (PHP 5.1)

functionfunction puissance puissance((Entier Entier $$_n_n,, Entier Entier $$_p_p)) {{……}}

Page 31: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

313103:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Typage des paramètresTypage des paramètres

classclass Entier Entier {{

publicpublic $$vv ;;

publicpublic functionfunction __construct(__construct($$_v_v)) {{

$$thisthis->->v v == $$_v_v ;; }}

publicpublic functionfunction egal egal((selfself $$aa)) {{

returnreturn intvalintval(($$thisthis->->v v ==== $$aa->->vv)) ;; }}

}}

$$E1E1 == newnew Entier Entier((1010)) ;;

$$E2E2 == newnew Entier Entier((2020)) ;;

echoecho $$E1E1->->egalegal(($$E2E2)) ;;

echoecho $$E1E1->->egalegal((1212)) ;;

00

Argument 1 passed to Entier::egal() must be an Argument 1 passed to Entier::egal() must be an instance of Entier, integer given, …instance of Entier, integer given, …

Page 32: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

323203:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

InterfacesInterfaces

Permet de spécifier quelles Permet de spécifier quelles méthodes doivent méthodes doivent être implémentéesêtre implémentées par une classe par une classe

Les méthodes doivent être Les méthodes doivent être identiquesidentiques : : au niveau du au niveau du nomnom au niveau du au niveau du nombre de paramètresnombre de paramètres au niveau de la au niveau de la nature de paramètresnature de paramètres

Une classe peut Une classe peut implémenterimplémenter plusieursplusieurs interfacesinterfaces

Une classe peu implémenter une interface à Une classe peu implémenter une interface à n'importe quel niveau de la hiérarchien'importe quel niveau de la hiérarchie

Page 33: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

333303:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Interfaces : exempleInterfaces : exemple

interfaceinterface Comparable Comparable {{

publicpublic functionfunction compare compare((selfself $$aa)) ;;

}}

classclass Entier Entier implementsimplements Comparable Comparable {{

publicpublic $$vv ;;

publicpublic functionfunction __construct(__construct($$_v_v)) {{

$$thisthis->->v v == $$_v_v ;;

}}

publicpublic functionfunction compare compare((selfself $$aa)) {{

returnreturn intvalintval(($$thisthis->->v v ==== $$aa->->vv)) ;;

}}

}}

InterfaceInterface

Méthode de Méthode de l'interfacel'interface

Classe implémentant Classe implémentant l'interfacel'interface

Méthode de Méthode de l'interfacel'interface

Page 34: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

Parcours d’objetsParcours d’objets

Parcours des attributs visibles avec foreachParcours des attributs visibles avec foreachclassclass Point Point {{

privateprivate $$x x == 0 0 ;;private private $$y y == 0 0 ;;protectedprotected $$dim dim == 2 2 ;;publicpublic $$nom nom == " "un pointun point"" ;;public public functionfunction parcours()parcours() {{

foreachforeach (($$thisthis asas $$propprop =>=> $$valval)) echoecho " "$$propprop: : $$valval\n\n" ; " ; }}

}}

$$pp == newnew Point Point()() ;;foreachforeach (($$pp asas $$propprop =>=> $$valval)) echoecho " "$$propprop: : $$valval\n\n" ; " ; $$pp->->parcoursparcours()() ; ;

343403:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

nom : un pointnom : un point

x: 0x: 0y: 0y: 0dim : 2dim : 2nom : un pointnom : un point

Page 35: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

Mot clé Mot clé finalfinal (méthode) (méthode)

Rend impossible la surcharge d’une méthode Rend impossible la surcharge d’une méthode par les classes fillespar les classes filles

classclass Simple Simple {{finalfinal publicpublic functionfunction affiche affiche()() {{

echoecho " "Je suisJe suis SimpleSimple" ; " ; }}}}classclass Etendue Etendue extendsextends Simple Simple {{publicpublic functionfunction affiche affiche()() {{

parentparent::::afficheaffiche()() ; ;echoecho " " mais aussi Etendue mais aussi Etendue" ;" ;

}}}}

353503:24:5303:24:53 Programmation Web 2012-2013Programmation Web 2012-2013

Cannot override final method Simple::affiche()Cannot override final method Simple::affiche()

Page 36: 11:37:32 Programmation Web 2012-2013 1 PHP5 objet "avancé" Jérôme CUTRONA jerome.cutrona@univ-reims.fr

Mot clé Mot clé finalfinal (classe) (classe)

La classe ne peut être étendueLa classe ne peut être étenduefinalfinal classclass Simple Simple {{publicpublic functionfunction affiche affiche()() {{

echoecho " "Je suisJe suis SimpleSimple" ; " ; }}}}classclass Etendue Etendue extendsextends Simple Simple {{publicpublic functionfunction affiche affiche()() {{

parentparent::::afficheaffiche()() ; ;echoecho " " mais aussi Etendue mais aussi Etendue" ;" ;

}}}}

363603:24:5403:24:54 Programmation Web 2012-2013Programmation Web 2012-2013

Class Etendue may not inherit from final class Class Etendue may not inherit from final class (Simple)(Simple)