Ce billet fait parti de la série sur la poo en php.
La dernière fois nous avions écrit notre première classe dans le cadre de notre apprentissage de la poo avec php. Un des problèmes que nous avions évoqué était qu’en php5 nous ne pouvions avoir qu’un constructeur (méthode __construct() ). C’est la raison « pratique » pour laquelle nous allons utiliser le pattern factory.
Cependant il y a d’autres raisons, que je classifie de « philosophiques », au fait que nous utilisions les factories.
Mais tout d’abord « c’est quoi un(e) factory?? »
Le principe des factories
Techniquement c’est une classe qui ne contient que des méthodes statiques. Ces méthodes statiques retournent des objets. Par exemple, la classe UtilisateurFactory.class.php ne contiendra que des méthodes statiques qui retourneront des instances de Utilisateur.class.php. Les méthodes que nous pourrions retrouver sont :
- static function creerUtilisateur($login,$password,$mail);
- static function loginUtilisateur($login,$password);
Chaque méthode retournera un objet utilisateur. Ca c’était pour le coté technique. Regardons du coté « philosophique ».
Si il y a quelque chose sur lequel je porte de l’attention, c’est la clarté et la maintenabilité du code…autrement dit la « beauté » du code!
Et c’est la que les factories jouent doublement leur rôle. D’une part on sépare complètement la manière de créer un objet et l’objet en lui même. D’un côté les méthodes du factory servent juste à créer des objets (ce qui va correspondre en SQL à des INSERT/SELECT). De l’autre les méthodes de l’objet agissent DIRECTEMENT sur l’objet et correspondront à des UDPATE/DELETE en SQL.
Pour reprendre l’exemple de l’utilisateur : le factory se charge de créer l’utilisateur (INSERT) ou de le loggé (SELECT) et un utilisateur peux changer son mail (UPDATE) ou supprimer son compte (DELETE).
Ensuite, si on veut se rapprocher du model MVC, les factories simplifie enormement la lecture du code (et donc son écriture!) puisque au moment de la création seule la méthode correspondant à l’action à réaliser est appelée. Pas besoin de créer un objet, puis de « setter » les variables et ensuite d’appeler une méthode save, etc etc. Notre méthode creerUtilisateur se charge de tout.
Il y aurait encore beaucoup d’avantages à énumérer mais vous avez les principaux à mon sens
C’est un peu déroutant au début et on est tout le temps en train de se demander « alors ca ca va dans la factorie? dans laquelle? comment je l’appelle? » mais après quelques heures on voit déjà les bénéfices
Dernier petit conseil, donnez des noms qui ont du sens à vos méthodes et variables. Ne pas hésiter par exemple à appeler une méthode : getBouteillesFromCasierByMillesimeAndAppellation($millesime,$appellation); votre IDE se chargera de l’écrire à votre place les fois suivante
Et personnelement je joue beaucoup sur les pluriels pour savoir si ma méthodes va me retourner un objet seul ou un tableau d’objets…
Pour mieux comprendre le sujet je vous propose de suivre ce screencast qui reprend les exemples précédents. Pour votre confort, activez la HD et le mode plein écran.
[poo php] découverte du pattern factory from Antoine Guiral on Vimeo.
User Responses
14 Responses and Counting...
Leave a Reply
[tuto jquery] drag ‘n drop avec sauvegarde automatique en base de données (2/2)
[tuto jquery] drag ‘n drop avec sauvegarde automatique en base de données (1/2)
[2 birthday] 2 ans aujourd'hui = 2 smashing book à gagner
[tuto web] cadre avec bordures extensibles valide xhtml/css
[tuto mashup] Google maps sur votre site : c'est possible! (version statique)
- Lever des fonds 5 mars 2010 Olivier Marone
- Why Google Pushed Buzz Out The Door Before It Was Ready 1 mars 2010 Erick Schonfeld
- Les levées de fonds dans les start-up : Des divergences d’intérêts entre entrepreneurs et investisseurs 1 mars 2010 Olivier Marone
- 11082 26 février 2010 (author unknown)
- 7 conseils pour mélanger plusieurs fontes dans votre design web 19 février 2010 Bruno Bichet




![[3615 mylife] Limoges, c’est fini. La suite?](http://antoine.guiral.info/wp-content/uploads/2010/02/stvincent.jpg)
![[facebook] Du nouveau sur la roadmap](http://antoine.guiral.info/wp-content/uploads/2010/02/facebook_logo.png)
![[facebook php] hiphop for php : une petite révolution dans le monde du développement web et de php](http://antoine.guiral.info/wp-content/uploads/2010/02/hiphop.jpg)
![[apple iPad] énorme succés de l’iPad à la dernière keynote d’apple](http://antoine.guiral.info/wp-content/uploads/2010/01/ipad.jpg)
![[google] google, le 51ème état?](http://antoine.guiral.info/wp-content/uploads/2010/01/51emeetat.jpg)
mai 07, 2009
pas mal tous ces screencasts
je trouve juste dommage une chose : pour être full php5, pourquoi ne pas utiliser la classe mysqli pour la base de données ? voilà pour la petite remarque. @ Bientôt !
mai 07, 2009
Salut, merci
Pour mysqli ca va venir
c’est une des raisons pour lesquelles je met de coté toute la partie base de donnée dans les tutos
Stay tuned
et à un de ces 4 sur la route lol
mai 07, 2009
Salut, sympa c’est screenCast !
Ca ma permis d’apprendre un peu le but de la POO pour mon projet de fin d’année .
Merci vivement le prochain =)
mai 07, 2009
Merci,
malheureusement ma machine est en panne et je ne pourrais poster le prochain que sous quelques jours…mais plsu ca va aller et plus on abordera des points précis
stay tuned
mai 07, 2009
[...] [poo php] le pattern factory #1 [...]
mai 07, 2009
super, ca
mai 07, 2009
Joli boulot. Très clair avec ça.
J’ai une question.
Est-ce qu’on est gagnant à utiliser la factory sur des objets pour obtenir une liste de data?
Par exemple:
J’ai un objet Truc avec une factory GetTruc(). Dans cette fonction, je veux récupérer l’ensemble des trucs (select *). Est-ce que ça me retourne un objet par Truc ou un gigantesque objet contenant tous les Trucs?
Chaipassichuiclère
Merci
mai 07, 2009
Salut jpc,
par exemple :
oui bien sur tu peux
getUtilisateurs() (remarques le pluriel
) : au moment de ton fetch tu remplis un tableau avec tes objets utilisateur (chaque lignes du select correspond à un objet). Puis tu retournes ton tableau
Merci pour le compliment
mai 07, 2009
Hello,
Très bon screencast qui montre bien l’intérêt du pattern Factory.
2 – 3 petites remarques si on veut être pointilleux (ça ne concerne pas directement le pattern Factory) :
- le mot clé static n’est pas vraiment à mettre dans le même sac que public/private/protected, le 1er pouvant se combiner avec l’un des seconds
- tu peux peux accéder au nom de la méthode courante en utilisant la métaconstante __METHOD__ (de même pour le nom de la classe __CLASS__)
Je recherche actuellement un bon ouvrage (de préférence en français, sinon anglais) sur les Design Patterns, en connais-tu ? J’ai acheté récemment PHP5 Best Practices de Gullaume Ponçon, mais je trouve la partie concernant les patterns peu intuitive et très légère…
mai 07, 2009
merci pour tes deux remarques judicieuse
En ce qui concerne les livres, je n’en connais pas…quelques court chapitre dans le certification study guide de zend…
A bientot
mai 07, 2009
J’ai vu venir le coup du md5 du md5, j’ai un peu jubilé j’avoue ^^ (au passage je préfère sha1 qui me semble un peu plus ’secure’).
Merci pour ce tuto, ceci dit, j’aimerais me servir du factory pour creer un ‘wrapper’ de base donnée (utiliser de maniere transparente n’importe quel base (mysql, postgres, oracle) avec la meme classe), mais je ne vois toujours pas vraiment comment proceder… Je garde quand même cet exemple sous le coude, très pertient. Merci.
mai 07, 2009
Très bien expliqué. Je me met de ce pas au pattern factory ^^
Merci pour l’astuce du list() :p
mai 07, 2009
Bonjour Antoine, Merci beaucoup pour cette video très calaire,
J’ai une petite question : C’est quoi l’environnement de développement php que tu utilises dans la video?
mai 07, 2009
Salut ali,
c’est de la bombe 
j’utilise netbeans
enjoy