30
13/07/11 1 Objets et patterns en PHP Objets, patterns et génie logiciel en PHP

Objets patterns et genie logiciel , par Julien Pauli

Embed Size (px)

DESCRIPTION

Lorsqu’on parle d’objet, de patterns ou de génie logiciel, PHP fait souvent sourire et Java vient tout de suite en tête. Cette session a pour but de prouver que PHP est mature pour supporter des projets d’envergure. Nous détaillerons techniquement le modèle objet de PHP, nous parlerons design patterns et génie logiciel, UML à l’appuie. Comment PHP a-t-il évolué sur ces points ? Comment fonctionne-t-il et quels sont les projets open sources basés sur PHP et orientés patterns ?

Citation preview

Page 1: Objets patterns et genie logiciel , par Julien Pauli

13/07/11 1Objets et patterns en PHP

Objets, patterns et génie logiciel en PHP

Page 2: Objets patterns et genie logiciel , par Julien Pauli

213/07/11 Objets et patterns en PHP

Qui suis-je ?Julien PAULI ; [email protected]

Architecte système et logiciel

Expert spécialiste plateforme LAMP (PHP)

Contributeur open source

Consultant

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

@julienpauli

Page 3: Objets patterns et genie logiciel , par Julien Pauli

313/07/11 Objets et patterns en PHP

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

Page 4: Objets patterns et genie logiciel , par Julien Pauli

413/07/11 Objets et patterns en PHP

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!

Page 5: Objets patterns et genie logiciel , par Julien Pauli

513/07/11 Objets et patterns en PHP

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)

Page 6: Objets patterns et genie logiciel , par Julien Pauli

613/07/11 Objets et patterns en PHP

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

Page 7: Objets patterns et genie logiciel , par Julien Pauli

713/07/11 Objets et patterns en PHP

PHP et OOPPas 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

...

Page 8: Objets patterns et genie logiciel , par Julien Pauli

813/07/11 Objets et patterns en PHP

OOP PHP face à OOP JavaPas 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

Page 9: Objets patterns et genie logiciel , par Julien Pauli

913/07/11 Objets et patterns en PHP

Modèle objet de PHPnamespaces

classes abstraites

interfaces

Héritage simple (non multiple)

Pas de persistence

Sérialization

namespace JPDO\Result;

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

Page 10: Objets patterns et genie logiciel , par Julien Pauli

1013/07/11 Objets et patterns en PHP

Principes SOLIDRègles régissant la conception orientée Objet

Single Responsability

Open/Close Principle

Liskov substitution Principle

Interface Seggregation

Dependency Injection

Page 11: Objets patterns et genie logiciel , par Julien Pauli

1113/07/11 Objets et patterns en PHP

PHP et SOLIDLiskov 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()

Page 12: Objets patterns et genie logiciel , par Julien Pauli

1213/07/11 Objets et patterns en PHP

PHP et SOLIDDependency 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; }}

Page 13: Objets patterns et genie logiciel , par Julien Pauli

1313/07/11 Objets et patterns en PHP

PHP et SOLIDInterface Seggregation

Un objet A ne doit pas utiliser un objet B directement, mais une interface Ib de B

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

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

interface Ib { function someMethod() { }}

Page 14: Objets patterns et genie logiciel , par Julien Pauli

1413/07/11 Objets et patterns en PHP

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

Page 15: Objets patterns et genie logiciel , par Julien Pauli

1513/07/11 Objets et patterns en PHP

PHP plein d'exceptions

Page 16: Objets patterns et genie logiciel , par Julien Pauli

1613/07/11 Objets et patterns en PHP

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

Page 17: Objets patterns et genie logiciel , par Julien Pauli

1713/07/11 Objets et patterns en PHP

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

Page 18: Objets patterns et genie logiciel , par Julien Pauli

1813/07/11 Objets et patterns en PHP

SingletonAttention à son utilisation anti-pattern...

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

Page 19: Objets patterns et genie logiciel , par Julien Pauli

1913/07/11 Objets et patterns en PHP

Observateur / SujetUn pattern très utile, pouvant être implémenté de plusieurs manières différentes

Page 20: Objets patterns et genie logiciel , par Julien Pauli

2013/07/11 Objets et patterns en PHP

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 }}

Page 21: Objets patterns et genie logiciel , par Julien Pauli

2113/07/11 Objets et patterns en PHP

Observateur / Sujet concrêt

Un pattern très utile, pouvant être implémenté de plusieurs manières différentes

Page 22: Objets patterns et genie logiciel , par Julien Pauli

2213/07/11 Objets et patterns en PHP

DécorateurPermet 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>"; }}

Page 23: Objets patterns et genie logiciel , par Julien Pauli

2313/07/11 Objets et patterns en PHP

DécorateurImplémentation PHP

class DecoratorItalic extends Decorator { public function ecrire($what) { return "<i>" . $this->_decorator->ecrire($what) . "</i>"; }}

interface Ecrivant { public function ecrire($what);}

abstract class Decorator implements Ecrivant { protected $_decorator; public function __construct(Ecrivant $s) { $this->_decorator = $s; }}

Page 24: Objets patterns et genie logiciel , par Julien Pauli

2413/07/11 Objets et patterns en PHP

DécorateurPassage 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 ?");

Page 25: Objets patterns et genie logiciel , par Julien Pauli

2513/07/11 Objets et patterns en PHP

ItérateurDé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);}

Page 26: Objets patterns et genie logiciel , par Julien Pauli

2613/07/11 Objets et patterns en PHP

Encore des patterns !Proxy

Poids plume

Pont

Adaptateur

MVC

Visiteur

...

Page 27: Objets patterns et genie logiciel , par Julien Pauli

2713/07/11 Objets et patterns en PHP

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

Page 28: Objets patterns et genie logiciel , par Julien Pauli

2813/07/11 Objets et patterns en PHP

Se documenter sur les patternsLes 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

Page 29: Objets patterns et genie logiciel , par Julien Pauli

2913/07/11 Objets et patterns en PHP

Se documenter sur les patterns en PHPLecture 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

Page 30: Objets patterns et genie logiciel , par Julien Pauli

3013/07/11 Objets et patterns en PHP

Merci !Questions ?