11:37:32 programmation web 2012-2013 1 php5 objet "avancé" jérôme cutrona...
TRANSCRIPT
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
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'';;
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()
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 ; ;
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 ;;
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
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)
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) { }
} }
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 =)
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) { }
} }
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
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
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)) ;;
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
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)
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
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
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)) ; ; } }} }
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
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
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)) ; ; } }} }
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
__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
__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é !
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
__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é !
__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é !
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
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'
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)) {{……}}
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, …
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
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
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
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()
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)