<ul><li>Objets, patterns et génie logiciel  en PHP </li></ul>
Qui suis-je ? <ul><li>Julien PAULI ; jpauli@php.net </li><ul><li>Architecte système et logiciel
Expert spécialiste plateforme LAMP (PHP)
Contributeur open source
Consultant
Co-Auteur (Eyrolles) </li></ul></ul>https://github.com/jpauli @julienpauli
Voyons voir ... <ul><li>Développement objet PHP </li><ul><li>Ou en est-on ?
Historique PHP
Différence avec d'autres langages </li></ul><li>Patterns et génie logiciel </li><ul><li>Rappels sur les principes SOLID
Rappels sur les patterns </li></ul><li>Objets et patterns en PHP </li><ul><li>Modèle objet de PHP détaillé
Quelques patterns en PHP </li></ul></ul>
PHP, rappelez moi ce que c'est ? <ul><li>Langage web interprété, crée en ~1998 </li><ul><li>Langage procédural
Syntaxe Inspirée de C
Possède un modèle objet, inspiré de Java
Ecrit en C (~800.000 lignes), Machine virtuelle
Extensible
Performant
Simple et efficace
Massivement déployé </li><ul><li>Y compris chez les &quot;gros&quot; </li><ul><li>Facebook
Yahoo! </li></ul></ul></ul></ul>
PHP où en est-on ? <ul><li>2009 : PHP 5.3 </li><ul><li>Enrichissement du modèle objet (namespaces)
Performances du moteur accrues (~+15%)
Meilleure gestion de la mémoire
Fonctions anonymes
Prévention de l'utilisation de fonctions dépréciées
Pilote MySQL natif (mysqlnd : licence PHP)
FastCGI refondu (PHP FPM) </li></ul></ul>
PHP où va-t-on ? <ul><li>~11/2010 : PHP 5.4 </li><ul><li>Traits (pseudo héritage horizontal)
Nettoyage d'anciennes fonctionnalités dépréciées
Serveur web intégré
Prochain SlideShare
Chargement dans…5
×

Patterns and OOP in PHP

2 354 vues

Publié le

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
2 354
Sur SlideShare
0
Issues des intégrations
0
Intégrations
56
Actions
Partages
0
Téléchargements
0
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Patterns and OOP in PHP

  1. 1. <ul><li>Objets, patterns et génie logiciel en PHP </li></ul>
  2. 2. Qui suis-je ? <ul><li>Julien PAULI ; jpauli@php.net </li><ul><li>Architecte système et logiciel
  3. 3. Expert spécialiste plateforme LAMP (PHP)
  4. 4. Contributeur open source
  5. 5. Consultant
  6. 6. Co-Auteur (Eyrolles) </li></ul></ul>https://github.com/jpauli @julienpauli
  7. 7. Voyons voir ... <ul><li>Développement objet PHP </li><ul><li>Ou en est-on ?
  8. 8. Historique PHP
  9. 9. Différence avec d'autres langages </li></ul><li>Patterns et génie logiciel </li><ul><li>Rappels sur les principes SOLID
  10. 10. Rappels sur les patterns </li></ul><li>Objets et patterns en PHP </li><ul><li>Modèle objet de PHP détaillé
  11. 11. Quelques patterns en PHP </li></ul></ul>
  12. 12. PHP, rappelez moi ce que c'est ? <ul><li>Langage web interprété, crée en ~1998 </li><ul><li>Langage procédural
  13. 13. Syntaxe Inspirée de C
  14. 14. Possède un modèle objet, inspiré de Java
  15. 15. Ecrit en C (~800.000 lignes), Machine virtuelle
  16. 16. Extensible
  17. 17. Performant
  18. 18. Simple et efficace
  19. 19. Massivement déployé </li><ul><li>Y compris chez les &quot;gros&quot; </li><ul><li>Facebook
  20. 20. Yahoo! </li></ul></ul></ul></ul>
  21. 21. PHP où en est-on ? <ul><li>2009 : PHP 5.3 </li><ul><li>Enrichissement du modèle objet (namespaces)
  22. 22. Performances du moteur accrues (~+15%)
  23. 23. Meilleure gestion de la mémoire
  24. 24. Fonctions anonymes
  25. 25. Prévention de l'utilisation de fonctions dépréciées
  26. 26. Pilote MySQL natif (mysqlnd : licence PHP)
  27. 27. FastCGI refondu (PHP FPM) </li></ul></ul>
  28. 28. PHP où va-t-on ? <ul><li>~11/2010 : PHP 5.4 </li><ul><li>Traits (pseudo héritage horizontal)
  29. 29. Nettoyage d'anciennes fonctionnalités dépréciées
  30. 30. Serveur web intégré
  31. 31. Support dtrace
  32. 32. Syntaxe améliorée </li></ul></ul>
  33. 33. PHP et OOP <ul><li>Pas un langage orienté objet </li><ul><li>Mais modèle objet présent
  34. 34. Proche de celui de Java (pas d'héritage multiple) </li></ul><li>Quelques objets/interfaces natif </li><ul><li>Iterator / ArrayAccess / Traversable / JsonSerializable
  35. 35. DateTime / DateTimeZone/ PDO / SimpleXml / Dom </li></ul><li>Des frameworks full OO </li><ul><li>ZendFramework
  36. 36. Symfony
  37. 37. CodeIgniter
  38. 38. ... </li></ul></ul>
  39. 39. OOP PHP face à OOP Java <ul><li>Pas de typage des retours de méthodes
  40. 40. Pas de déclaration des exceptions lancées
  41. 41. Pas de typage fort des attributs
  42. 42. Pas de finally (exceptions)
  43. 43. Pas de typage dynamique (duck typing)
  44. 44. Pas de visibilité &quot;package&quot;
  45. 45.
  46. 46. PHP n'est pas Java
  47. 47. Il s'inspire globalement de son modèle objet </li></ul>
  48. 48. Modèle objet de PHP <ul><li>namespaces
  49. 49. classes abstraites
  50. 50. interfaces
  51. 51. Héritage simple (non multiple)
  52. 52. Pas de persistence </li><ul><li>Sérialization </li></ul></ul>namespace JPDOResult; abstract class SavableObjects extends Objects implements SomeIface { public function save() { } abstract protected function load() { } }
  53. 53. Principes SOLID <ul><li>Règles régissant la conception orientée Objet
  54. 54. S ingle Responsability
  55. 55. O pen/Close Principle
  56. 56. L iskov substitution Principle
  57. 57. I nterface Seggregation
  58. 58. D ependency Injection </li></ul>
  59. 59. PHP et SOLID <ul><li>Liskov Subsitution </li><ul><li>Un objet utilisant A doit pouvoir utiliser un fils de A sans s'en rendre compte
  60. 60. L'héritage doit être strict, le type conservé </li></ul></ul>class A { public function foo($b, $c) { } } class B extends A { public function foo($b, $c, $d ) { } } Strict standards: Declaration of B::foo() should be compatible with that of A::foo()
  61. 61. PHP et SOLID <ul><li>Dependency Injection </li><ul><li>Un objet A ayant besoin de B ne doit pas chercher B lui-même, il doit le lui être injecté (agrégation) </li></ul></ul>class A { protected $b; public function setB( B $b) { $this->b = $b } public function getB() { return $this->b; } }
  62. 62. PHP et SOLID <ul><li>Interface Seggregation </li><ul><li>Un objet A ne doit pas utiliser un objet B directement, mais une interface Ib de B </li></ul></ul>class A { public function setB( Ib $b) { } } class B implements Ib { public function someMethod() { } } interface Ib { function someMethod() { } }
  63. 63. PHP Exceptions <ul><li>try { throw } catch () { }
  64. 64. Pas de finally
  65. 65. Pas d'interface Throwable </li></ul>try{ $result = $db->getResult(); }catch (BadArgumentException $e){ // une erreur dans les arguments d'une fonction }catch (DatabaseException $e){ // une erreur de base de données }catch (Exception $e){ echo 'erreur !' . $e->getMessage(); }
  66. 66. PHP plein d'exceptions
  67. 67. Finalement, on a de quoi utiliser des patterns ! <ul><li>Interfaces et classes abstraites
  68. 68. Héritage
  69. 69. Namespaces
  70. 70. Visibilité, encapsulation
  71. 71. PHP est tout à fait capable de supporter la plupart des patterns existants grâce à la fléxibilité de son modèle objet.
  72. 72. PHP reste un langage pour le web </li><ul><li>Inutile de le &quot;polluer&quot; de fonctionnalités non adaptées à cet environnement </li></ul></ul>
  73. 73. Design Patterns ? <ul><li>Solutions OO </li><ul><li>Remarquables
  74. 74. Implémentant SOLID
  75. 75. Répondent à des problèmes récurrents
  76. 76. Modélisables avec UML
  77. 77. Très connues des archi. logiciels
  78. 78. Organisées par familles </li><ul><li>Créateurs, structuraux, comportementaux </li></ul><li>Souvent passer de l'un à l'autre c'est changer quelques lignes de code
  79. 79. Permettent d'assurer la pérénité dans le code dans le temps </li></ul></ul>
  80. 80. Singleton <ul><li>Attention à son utilisation anti-pattern... </li></ul>class Singleton { protected static $_instance; protected function __construct() { } protected function __clone() { } public static function getInstance() { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; } assert(Singleton::getInstance() === Singleton::getInstance());
  81. 81. Observateur / Sujet <ul><li>Un pattern très utile, pouvant être implémenté de plusieurs manières différentes </li></ul>
  82. 82. Observateur / Sujet codé class SomeSubject implements Subject { protected $observers; protected function __construct() { $this->observers = new SplObjectStorage(); } protected function attach(Observer $o) { $this->observers->attach($o); } public function detach(Observer $o) { $this->observers->detach($o); } public function doSomething() { foreach ($this->observers as $o) { $o->update($this); } } } class SomeObserver implements Observer { public function update(Subject $s) { // let's do something here } }
  83. 83. Observateur / Sujet concrêt <ul><li>Un pattern très utile, pouvant être implémenté de plusieurs manières différentes </li></ul>
  84. 84. Décorateur <ul><li>Permet de résoudre la problématique de l'héritage multiple </li></ul>class Stylo { public function ecrire($what) { return &quot;Le stylo écrit $what&quot;; } } class StyloGras extends Stylo { public function ecrire($what) { return &quot;<b>&quot; . parent::ecrire($what) . &quot;</b>&quot;; } } class StyloItalic extends Stylo { public function ecrire($what) { return &quot;<i>&quot; . parent::ecrire($what) .&quot;</i>&quot;; } }
  85. 85. Décorateur <ul><li>Implémentation PHP </li></ul>class DecoratorItalic extends Decorator { public function ecrire($what) { return &quot;<i>&quot; . $this->_decorator->ecrire($what) . &quot;</i>&quot;; } } interface Ecrivant { public function ecrire($what); } abstract class Decorator implements Ecrivant { protected $_decorator; public function __construct(Ecrivant $s) { $this->_decorator = $s; } }
  86. 86. Décorateur <ul><li>Passage d'un modèle vertical (héritage) à un modèle horizontal (agrégation) </li></ul>$obj = new DecoratorItalic(new DecoratorBold(new Stylo)); echo $obj->ecrire(&quot;Voyez vous cela ?&quot;);
  87. 87. Itérateur <ul><li>Déjà présent dans PHP par défaut
  88. 88. Redéfinit l'opérateur foreach
  89. 89. Définit la manière dont PHP parcourt un objet </li></ul>$obj->rewind(); while ($obj->valid()) { printf(&quot;%s : %s n&quot;, $obj->key(), $obj->current()); $obj->next(); } foreach ($obj as $k => $v) { printf(&quot;%s : %s n&quot;, $k, $v); }
  90. 90. Encore des patterns ! <ul><li>Proxy
  91. 91. Poids plume
  92. 92. Pont
  93. 93. Adaptateur
  94. 94. MVC
  95. 95. Visiteur
  96. 96. ... </li></ul>
  97. 97. Où trouver des patterns ? <ul><li>Sur mon GitHub :) </li><ul><li>https://github.com/jpauli
  98. 98. Ils sont là à titre éducatif </li></ul><li>Concrètement : </li><ul><li>Dans les frameworks hautement orientés objets </li><ul><li>ZendFramework
  99. 99. Symfony </li></ul></ul><li>On les trouve aussi dans beaucoup d'autres projets PHP </li><ul><li>Pour peu qu'ils soient un minimum réfléchis et pros </li></ul></ul>
  100. 100. Se documenter sur les patterns <ul><li>Les langages OO sont mis en avant </li><ul><li>C++ , Java </li></ul><li>Les exemples en PHP sont donc rares
  101. 101. Il faut comprendre les langages OO pour faire du bon design applicatif en PHP </li></ul>
  102. 102. Se documenter sur les patterns en PHP <ul><li>Lecture et analyse de codes existants </li><ul><li>https://github.com/symfony/symfony
  103. 103. https://github.com/zendframework/zf2
  104. 104. https://github.com/manuelpichler/phpmd </li></ul><li>Utilisation d'autres langages OO </li><ul><li>Java
  105. 105. C++
  106. 106. Ruby&Rails </li></ul></ul>
  107. 107. Merci ! <ul><li>Questions ? </li></ul>

×