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 ?
Organiser efficacement son depot de code par Jean Marc Fontaine
Objets patterns et genie logiciel , par Julien Pauli
1. Objets, patterns et gé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 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
5. 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
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 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
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
16. 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
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 / 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
21. 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
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 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
28. 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
29. 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
30. Merci !
Questions ?
13/07/11 Objets et patterns en PHP 30