Objets, patterns et génie logiciel
 en PHP




13/07/11     Objets et patterns en PHP   1
Qui suis-je ?
           Julien PAULI ; jpauli@php.net
             Architecte système et logiciel


             Expert spécialiste plateforme LAMP (PHP)

             Contributeur open source

             Consultant

             Co-Auteur (Eyrolles)                          https://github.com/jpauli



                                                           @julienpauli

13/07/11                       Objets et patterns en PHP                          2
Voyons voir ...
           Développement objet PHP
             Ou en est-on ?
             Historique PHP
             Différence avec d'autres langages


           Patterns et génie logiciel
             Rappels sur les principes SOLID
             Rappels sur les patterns


           Objets et patterns en PHP
             Modèle objet de PHP détaillé
             Quelques patterns en PHP

13/07/11                      Objets et patterns en PHP   3
PHP, rappelez moi ce que c'est ?
       Langage web interprété, crée en ~1998
           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é
            ▪ Y compris chez les "gros"
                ‐ Facebook
                ‐ Yahoo!


13/07/11                        Objets et patterns en PHP    4
PHP où en est-on ?
           2009 : PHP 5.3
             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)




13/07/11                       Objets et patterns en PHP           5
PHP où va-t-on ?
           ~11/2010 : PHP 5.4
             Traits (pseudo héritage horizontal)
             Nettoyage d'anciennes fonctionnalités dépréciées
             Serveur web intégré
             Support dtrace
             Syntaxe améliorée




13/07/11                       Objets et patterns en PHP        6
PHP et OOP
           Pas un langage orienté objet
             Mais modèle objet présent
             Proche de celui de Java (pas d'héritage multiple)


           Quelques objets/interfaces natif
             Iterator / ArrayAccess / Traversable / JsonSerializable
             DateTime / DateTimeZone/ PDO / SimpleXml / Dom


           Des frameworks full OO
             ZendFramework
             Symfony
             CodeIgniter
             ...
13/07/11                       Objets et patterns en PHP               7
OOP PHP face à OOP Java
           Pas de typage des retours de méthodes
           Pas de déclaration des exceptions lancées
           Pas de typage fort des attributs
           Pas de finally (exceptions)
           Pas de typage dynamique (duck typing)
           Pas de visibilité "package"
           …

           PHP n'est pas Java
           Il s'inspire globalement de son modèle objet



13/07/11                        Objets et patterns en PHP   8
Modèle objet de PHP
           namespaces
           classes abstraites
           interfaces
           Héritage simple (non multiple)
           Pas de persistence
             Sérialization

       namespace JPDOResult;

       abstract class SavableObjects extends Objects implements SomeIface
       {
         public function save() { }
         abstract protected function load() { }
       }

13/07/11                        Objets et patterns en PHP                   9
Principes SOLID
           Règles régissant la conception orientée Objet

           Single Responsability

           Open/Close Principle


           Liskov substitution Principle

           Interface Seggregation

           Dependency Injection



13/07/11                      Objets et patterns en PHP    10
PHP et SOLID
      Liskov Subsitution
           Un objet utilisant A doit pouvoir utiliser un fils de A sans s'en rendre
           compte
           L'héritage doit être strict, le type conservé
                           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()
13/07/11                      Objets et patterns en PHP                                  11
PHP et SOLID
           Dependency Injection
             Un objet A ayant besoin de B ne doit pas chercher B lui-même, il
             doit le lui être injecté (agrégation)
                          class A
                          {
                             protected $b;

                              public function setB(B $b)
                              {
                                $this->b = $b
                              }

                              public function getB()
                              {
                                return $this->b;
                              }
                          }
13/07/11                      Objets et patterns en PHP                     12
PHP et SOLID
           Interface Seggregation
             Un objet A ne doit pas utiliser un objet B directement, mais une
             interface Ib de B

       class A                                        interface Ib
       {                                              {
          public function setB(Ib $b) { }                function someMethod() { }
       }                                              }


                           class B implements Ib
                           {
                              public function someMethod() { }
                           }



13/07/11                      Objets et patterns en PHP                              13
PHP Exceptions
           try { throw } catch () { }
           Pas de finally
           Pas d'interface Throwable

  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();
  }



13/07/11                     Objets et patterns en PHP   14
PHP plein d'exceptions




13/07/11       Objets et patterns en PHP   15
Finalement, on a de quoi utiliser des patterns !
           Interfaces et classes abstraites
           Héritage
           Namespaces
           Visibilité, encapsulation

           PHP est tout à fait capable de supporter la plupart des patterns
           existants grâce à la fléxibilité de son modèle objet.

           PHP reste un langage pour le web
             Inutile de le "polluer" de fonctionnalités non adaptées à cet
             environnement



13/07/11                       Objets et patterns en PHP                      16
Design Patterns ?
           Solutions OO
             Remarquables
             Implémentant SOLID
             Répondent à des problèmes récurrents
             Modélisables avec UML
             Très connues des archi. logiciels
             Organisées par familles
              ▪ Créateurs, structuraux, comportementaux
             Souvent passer de l'un à l'autre c'est changer quelques lignes de
             code

             Permettent d'assurer la pérénité dans le code dans le temps


13/07/11                       Objets et patterns en PHP                         17
Singleton
           Attention à son utilisation anti-pattern...


  class Singleton
  {
     protected static $_instance;

      protected function __construct() { }        assert(Singleton::getInstance() ===
      protected function __clone() { }                   Singleton::getInstance());
      public static function getInstance() {
        if (!self::$_instance) {
            self::$_instance = new self;
        }
        return self::$_instance;
  }


13/07/11                       Objets et patterns en PHP                           18
Observateur / Sujet
           Un pattern très utile, pouvant être implémenté de plusieurs
           manières différentes




13/07/11                     Objets et patterns en PHP                   19
Observateur / Sujet codé
class SomeSubject implements Subject
{
   protected $observers;
   protected function __construct() {
     $this->observers = new SplObjectStorage();       class SomeObserver
   }                                                  implements Observer
   protected function attach(Observer $o) {           {
     $this->observers->attach($o);                       public function
   }                                                  update(Subject $s) {
   public function detach(Observer $o) {                   // let's do something here
     $this->observers->detach($o);                       }
   }                                                  }
   public function doSomething() {
     foreach ($this->observers as $o) {
        $o->update($this);
     }
   }
}
13/07/11                  Objets et patterns en PHP                               20
Observateur / Sujet concrêt
           Un pattern très utile, pouvant être implémenté de plusieurs
           manières différentes




13/07/11                     Objets et patterns en PHP                   21
Décorateur
           Permet de résoudre la problématique de l'héritage multiple
                                                       class Stylo {
                                                          public function ecrire($what) {
                                                            return "Le stylo écrit $what";
                                                          }
                                                       }
class StyloGras extends Stylo {
   public function ecrire($what) {
     return "<b>" . parent::ecrire($what) . "</b>";
   }
}

                                       class StyloItalic extends Stylo {
                                          public function ecrire($what) {
                                            return "<i>" . parent::ecrire($what) ."</i>";
                                          }
                                       }
13/07/11                      Objets et patterns en PHP                                 22
Décorateur
           Implémentation PHP
                              interface Ecrivant {
                                 public function ecrire($what);
                              }

                  abstract class Decorator implements Ecrivant {
                    protected $_decorator;
                    public function __construct(Ecrivant $s) {
                       $this->_decorator = $s;
                    }
                  }
             class DecoratorItalic extends Decorator {
                public function ecrire($what) {
                  return "<i>" . $this->_decorator->ecrire($what) . "</i>";
                }
             }
13/07/11                        Objets et patterns en PHP                     23
Décorateur
           Passage d'un modèle vertical (héritage) à un modèle horizontal
           (agrégation)


            $obj = new DecoratorItalic(new DecoratorBold(new Stylo));
            echo $obj->ecrire("Voyez vous cela ?");




13/07/11                     Objets et patterns en PHP                      24
Itérateur
           Déjà présent dans PHP par défaut

           Redéfinit l'opérateur foreach
           Définit la manière dont PHP parcourt un objet
             $obj->rewind();
             while ($obj->valid()) {
               printf("%s : %s n", $obj->key(), $obj->current());
               $obj->next();
             }



             foreach ($obj as $k => $v) {
                printf("%s : %s n", $k, $v);
             }

13/07/11                        Objets et patterns en PHP            25
Encore des patterns !
           Proxy
           Poids plume
           Pont
           Adaptateur
           MVC
           Visiteur
           ...




13/07/11                 Objets et patterns en PHP   26
Où trouver des patterns ?
           Sur mon GitHub :)
             https://github.com/jpauli
             Ils sont là à titre éducatif


           Concrètement :
             Dans les frameworks hautement orientés objets
              ▪ ZendFramework
              ▪ Symfony



           On les trouve aussi dans beaucoup d'autres projets PHP
             Pour peu qu'ils soient un minimum réfléchis et pros



13/07/11                        Objets et patterns en PHP           27
Se documenter sur les patterns
           Les langages OO sont mis en avant
             C++ , Java
           Les exemples en PHP sont donc rares

           Il faut comprendre les langages OO
           pour faire du bon design applicatif en
           PHP




13/07/11                     Objets et patterns en PHP   28
Se documenter sur les patterns en PHP
           Lecture et analyse de codes existants
             https://github.com/symfony/symfony
             https://github.com/zendframework/zf2
             https://github.com/manuelpichler/phpmd


           Utilisation d'autres langages OO
             Java
             C++
             Ruby&Rails




13/07/11                     Objets et patterns en PHP   29
Merci !
           Questions ?




13/07/11                 Objets et patterns en PHP   30

Objets patterns et genie logiciel , par Julien Pauli

  • 1.
    Objets, patterns etgénie logiciel en PHP 13/07/11 Objets et patterns en PHP 1
  • 2.
    Qui suis-je ? Julien PAULI ; jpauli@php.net Architecte système et logiciel Expert spécialiste plateforme LAMP (PHP) Contributeur open source Consultant Co-Auteur (Eyrolles) https://github.com/jpauli @julienpauli 13/07/11 Objets et patterns en PHP 2
  • 3.
    Voyons voir ... Développement objet PHP Ou en est-on ? Historique PHP Différence avec d'autres langages Patterns et génie logiciel Rappels sur les principes SOLID Rappels sur les patterns Objets et patterns en PHP Modèle objet de PHP détaillé Quelques patterns en PHP 13/07/11 Objets et patterns en PHP 3
  • 4.
    PHP, rappelez moice que c'est ? Langage web interprété, crée en ~1998 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é ▪ Y compris chez les "gros" ‐ Facebook ‐ Yahoo! 13/07/11 Objets et patterns en PHP 4
  • 5.
    PHP où enest-on ? 2009 : PHP 5.3 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) 13/07/11 Objets et patterns en PHP 5
  • 6.
    PHP où va-t-on? ~11/2010 : PHP 5.4 Traits (pseudo héritage horizontal) Nettoyage d'anciennes fonctionnalités dépréciées Serveur web intégré Support dtrace Syntaxe améliorée 13/07/11 Objets et patterns en PHP 6
  • 7.
    PHP et OOP Pas un langage orienté objet Mais modèle objet présent Proche de celui de Java (pas d'héritage multiple) Quelques objets/interfaces natif Iterator / ArrayAccess / Traversable / JsonSerializable DateTime / DateTimeZone/ PDO / SimpleXml / Dom Des frameworks full OO ZendFramework Symfony CodeIgniter ... 13/07/11 Objets et patterns en PHP 7
  • 8.
    OOP PHP faceà OOP Java Pas de typage des retours de méthodes Pas de déclaration des exceptions lancées Pas de typage fort des attributs Pas de finally (exceptions) Pas de typage dynamique (duck typing) Pas de visibilité "package" … PHP n'est pas Java Il s'inspire globalement de son modèle objet 13/07/11 Objets et patterns en PHP 8
  • 9.
    Modèle objet dePHP namespaces classes abstraites interfaces Héritage simple (non multiple) Pas de persistence Sérialization namespace JPDOResult; abstract class SavableObjects extends Objects implements SomeIface { public function save() { } abstract protected function load() { } } 13/07/11 Objets et patterns en PHP 9
  • 10.
    Principes SOLID Règles régissant la conception orientée Objet Single Responsability Open/Close Principle Liskov substitution Principle Interface Seggregation Dependency Injection 13/07/11 Objets et patterns en PHP 10
  • 11.
    PHP et SOLID Liskov Subsitution Un objet utilisant A doit pouvoir utiliser un fils de A sans s'en rendre compte L'héritage doit être strict, le type conservé 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() 13/07/11 Objets et patterns en PHP 11
  • 12.
    PHP et SOLID Dependency Injection Un objet A ayant besoin de B ne doit pas chercher B lui-même, il doit le lui être injecté (agrégation) class A { protected $b; public function setB(B $b) { $this->b = $b } public function getB() { return $this->b; } } 13/07/11 Objets et patterns en PHP 12
  • 13.
    PHP et SOLID Interface Seggregation Un objet A ne doit pas utiliser un objet B directement, mais une interface Ib de B class A interface Ib { { public function setB(Ib $b) { } function someMethod() { } } } class B implements Ib { public function someMethod() { } } 13/07/11 Objets et patterns en PHP 13
  • 14.
    PHP Exceptions try { throw } catch () { } Pas de finally Pas d'interface Throwable 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(); } 13/07/11 Objets et patterns en PHP 14
  • 15.
    PHP plein d'exceptions 13/07/11 Objets et patterns en PHP 15
  • 16.
    Finalement, on ade quoi utiliser des patterns ! Interfaces et classes abstraites Héritage Namespaces Visibilité, encapsulation PHP est tout à fait capable de supporter la plupart des patterns existants grâce à la fléxibilité de son modèle objet. PHP reste un langage pour le web Inutile de le "polluer" de fonctionnalités non adaptées à cet environnement 13/07/11 Objets et patterns en PHP 16
  • 17.
    Design Patterns ? Solutions OO Remarquables Implémentant SOLID Répondent à des problèmes récurrents Modélisables avec UML Très connues des archi. logiciels Organisées par familles ▪ Créateurs, structuraux, comportementaux Souvent passer de l'un à l'autre c'est changer quelques lignes de code Permettent d'assurer la pérénité dans le code dans le temps 13/07/11 Objets et patterns en PHP 17
  • 18.
    Singleton Attention à son utilisation anti-pattern... class Singleton { protected static $_instance; protected function __construct() { } assert(Singleton::getInstance() === protected function __clone() { } Singleton::getInstance()); public static function getInstance() { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; } 13/07/11 Objets et patterns en PHP 18
  • 19.
    Observateur / Sujet Un pattern très utile, pouvant être implémenté de plusieurs manières différentes 13/07/11 Objets et patterns en PHP 19
  • 20.
    Observateur / Sujetcodé class SomeSubject implements Subject { protected $observers; protected function __construct() { $this->observers = new SplObjectStorage(); class SomeObserver } implements Observer protected function attach(Observer $o) { { $this->observers->attach($o); public function } update(Subject $s) { public function detach(Observer $o) { // let's do something here $this->observers->detach($o); } } } public function doSomething() { foreach ($this->observers as $o) { $o->update($this); } } } 13/07/11 Objets et patterns en PHP 20
  • 21.
    Observateur / Sujetconcrêt Un pattern très utile, pouvant être implémenté de plusieurs manières différentes 13/07/11 Objets et patterns en PHP 21
  • 22.
    Décorateur Permet de résoudre la problématique de l'héritage multiple class Stylo { public function ecrire($what) { return "Le stylo écrit $what"; } } class StyloGras extends Stylo { public function ecrire($what) { return "<b>" . parent::ecrire($what) . "</b>"; } } class StyloItalic extends Stylo { public function ecrire($what) { return "<i>" . parent::ecrire($what) ."</i>"; } } 13/07/11 Objets et patterns en PHP 22
  • 23.
    Décorateur Implémentation PHP interface Ecrivant { public function ecrire($what); } abstract class Decorator implements Ecrivant { protected $_decorator; public function __construct(Ecrivant $s) { $this->_decorator = $s; } } class DecoratorItalic extends Decorator { public function ecrire($what) { return "<i>" . $this->_decorator->ecrire($what) . "</i>"; } } 13/07/11 Objets et patterns en PHP 23
  • 24.
    Décorateur Passage d'un modèle vertical (héritage) à un modèle horizontal (agrégation) $obj = new DecoratorItalic(new DecoratorBold(new Stylo)); echo $obj->ecrire("Voyez vous cela ?"); 13/07/11 Objets et patterns en PHP 24
  • 25.
    Itérateur Déjà présent dans PHP par défaut Redéfinit l'opérateur foreach Définit la manière dont PHP parcourt un objet $obj->rewind(); while ($obj->valid()) { printf("%s : %s n", $obj->key(), $obj->current()); $obj->next(); } foreach ($obj as $k => $v) { printf("%s : %s n", $k, $v); } 13/07/11 Objets et patterns en PHP 25
  • 26.
    Encore des patterns! Proxy Poids plume Pont Adaptateur MVC Visiteur ... 13/07/11 Objets et patterns en PHP 26
  • 27.
    Où trouver despatterns ? Sur mon GitHub :) https://github.com/jpauli Ils sont là à titre éducatif Concrètement : Dans les frameworks hautement orientés objets ▪ ZendFramework ▪ Symfony On les trouve aussi dans beaucoup d'autres projets PHP Pour peu qu'ils soient un minimum réfléchis et pros 13/07/11 Objets et patterns en PHP 27
  • 28.
    Se documenter surles patterns Les langages OO sont mis en avant C++ , Java Les exemples en PHP sont donc rares Il faut comprendre les langages OO pour faire du bon design applicatif en PHP 13/07/11 Objets et patterns en PHP 28
  • 29.
    Se documenter surles patterns en PHP Lecture et analyse de codes existants https://github.com/symfony/symfony https://github.com/zendframework/zf2 https://github.com/manuelpichler/phpmd Utilisation d'autres langages OO Java C++ Ruby&Rails 13/07/11 Objets et patterns en PHP 29
  • 30.
    Merci ! Questions ? 13/07/11 Objets et patterns en PHP 30