programmation orientée objet et les traits en php 5.4
DESCRIPTION
Présentation pour l'AFUP des Traits sous PHP 5.4TRANSCRIPT
![Page 1: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/1.jpg)
Programmation orientée ObjetVers php 5.4
![Page 2: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/2.jpg)
Réduire le couplage applicatif grâce aux Traits
![Page 3: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/3.jpg)
(mauvaise) définition scolaire de l'objet
• Un objet est une représentation concrète d'un concept abstrait
![Page 4: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/4.jpg)
Une classe
• Contient des attributs et des méthodes dont la portée peut être limitée
• Un seul héritage pour n interfaces
• Une méthode est identifiée par sa signature
![Page 5: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/5.jpg)
La signature/**
* description de la méthode
*
* @access public
* @param integer $nombre
* @return string
*/
public function example($nombre) {
return "une chaîne";
}
![Page 6: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/6.jpg)
L'interface• Permet de s'assurer que les objets manipulés
fonctionnent de la même manière
=> Contrat
Public fonction utilise(interfaceStylo $stylo) {
}
![Page 7: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/7.jpg)
La Php Standard Library
• Ou SPL
• Permet d'ajouter des fonctionnalités à des objets
• Exemple : l'interface countable
Class CountMe implements Countable {
Public fonction count() {
Return 5;
}
}
$object = new CountMe;
echo sizeof($object); // 5
![Page 8: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/8.jpg)
FailUn objet c'est pas ça !
![Page 9: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/9.jpg)
Pas une représentation concrète
• On n'a jamais vu un "lanceur de requête Sql" dans la vraie vie
![Page 10: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/10.jpg)
Repenser la définition d'un objet
![Page 11: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/11.jpg)
Un objet est un comportement
• Un objet est un comportement vis à vis de données
• L'agrégat des comportements constitue une application
![Page 12: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/12.jpg)
L'héritage
• Spécialisation d'un comportement
• Une classe fille peut réutiliser ou spécialiser le comportement de sa classe mère
• Pas d'héritage multiple en PHP
![Page 13: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/13.jpg)
L'héritage échouePour 2 raisons
![Page 14: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/14.jpg)
1/ spécialiser n'est pas décliner
• Souvent on ne spécialise pas, on décline
• C'est infini !
![Page 15: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/15.jpg)
2/ l'héritage "outil"• L'héritage ne doit pas permettre de donner des outils
Class Example extends Singleton {}
=> ça ne doit pas exister !!
![Page 16: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/16.jpg)
Le couplage applicatif(petit détour)
![Page 17: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/17.jpg)
Code spagethi
• Dépendances fortes entre les composants
• Tout est entremêlé
• Maintenabilité faible
![Page 18: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/18.jpg)
le couplage applicatif• Principe SOLID
• Single Responsability
• Open / closes
• Liskov substitution
• Interface segregation
• Dépendency inversion
Couplage faible
![Page 19: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/19.jpg)
Horizontalité vs Verticalité• Un modèle vertical (type héritage mal conçu) n'est
pas maintenable
• Penser horizontal :
• Pattern Strategy
• Injection de dépendance
![Page 20: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/20.jpg)
Les Traits(pas trop tôt)
![Page 21: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/21.jpg)
Blocs de comportement• Réutilisables
• Modèle orienté collaboration
Class Example {
Use Trait1, Trait2;
}
![Page 22: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/22.jpg)
À l'origine : les mixins
• Composants liés à la réutilisation plutôt qu'à l'instanciation
• Sont mélangés au code (mixed-in)
• Injectés dans le code au moment de l'héritage
• Conflits entre les mixins
![Page 23: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/23.jpg)
Les Traits
• Réutilisation de fonctionnalités au niveau des classes
• L'ensemble des méthodes d'un Trait constituent son comportement
• Sans État
![Page 24: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/24.jpg)
Gestion des conflits• Pas de priorité implicite
Class Example {
Use Trait1, Trait2 {
Trait2::myMethod as m;
Trait1::any insteadof Trait2
}
}
• Résolution explicite des conflits
![Page 25: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/25.jpg)
Traits composites
• Un Trait peut être composé d'autres Traits
• On parle alors de Traits composites
![Page 26: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/26.jpg)
Trait Singleton {
/**
* Constructor
*/
protected function __construct() {}
/**
* Get singleton instance
* @return static
*/
public static function getInstance() {
static $instance = null;
if (is_null($instance)) {
$instance = new static;
}
return $instance;
}
/**
* Prevents cloning
* @throws Exception
*/
public function __clone() {
throw new \Exception('Cloning of this object isn\'t authorized');
}
/**
* Prevents deserialization
* @throws Exception
*/
public function __wakeup() {
throw new \Exception("Cannot deserialize instance of Singleton pattern in" . get_called_class());
}
}
![Page 27: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/27.jpg)
class Example extends MaClasseMetier {
use \Singleton;
}
$oExample = Example::getInstance();
var_dump($oExample === Example::getInstance());
// true
$oExample = new Example;
// Fatal error: Call to protected Example::__construct() from invalid context
![Page 28: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/28.jpg)
Et c'est pas plus lent
1130
1135
1140
1145
1150
heritage 1 trait 4 traits
![Page 29: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/29.jpg)
Liens et ressources
![Page 30: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/30.jpg)
Sur le netRFC des traits : https://wiki.php.net/rfc/horizontalreuse
Recherches d'Alexandre Bergel : http://bergel.eu
![Page 31: Programmation Orientée Objet et les Traits en PHP 5.4](https://reader038.vdocuments.site/reader038/viewer/2022103001/55892b92d8b42a96088b469b/html5/thumbnails/31.jpg)
Questions