|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 15 ![]() |
Bonjour,
Je commence la programmation orientée objet en PHP avec utilisation d'une base de données. Cependant, je ne sais pas si ma manière d'aborder le problème est correcte en ce qui concerne la façon de gérer les échanges avec la base de données. Je vais prendre un exemple simplifié volontairement. Ma base de données : Ma classe : Code :
Ce mode de fonctionnement est-il "correct", mauvais ou à améliorer ? Avez-vous de meilleures façon de faire à me conseiller ? Merci d'avance pour votre aide |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Développeur informatique Inscription : août 2005 Messages : 1 179 ![]() |
Bonjour,
j'y ajouterais au minimum des contrôles sur les données, une protection de type htmlspecialchars ou autre. J'imagine que tu le fais dans les mutateurs... Un nommage des méthodes génériques plus explicite et/ou conventionnel : article->create(), article->update(), article->delete(), article->getAll().... et surtout une gestion des exceptions... tu instancies la classe avec un ID, dans ce cas, tu ne vises pas la possibilité de créer un nouvel enregistrement. j'aurais mis une valeur par défaut au paramètre de manière à tester sa valeur et détecter une création... ou alors testes au moins son existence avant de tenter d'aller chercher son contenu en base.
__________________
http://cdemarche.developpez.com/ Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
|
|
|
00
|
|
|
#3 | |||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 15 ![]() |
Citation:
Tu fais bien d'aborder l'histoire du nouvel enregistrement : je voulais au départ faire de la surcharge de constructeur, mais je me suis retrouvé face à une erreur fatale et j'ai constaté qu'il n'était apparemment pas possible d'en faire en PHP Au final, j'ai procédé comme tel (toujours de mémoire et simplifié) : Code :
|
|||
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() Développeur informatique Inscription : août 2005 Messages : 1 179 ![]() |
Code :
__________________
http://cdemarche.developpez.com/ Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
|
||
|
|
00
|
|
|
#5 | ||
|
Expert Confirmé
![]() ![]() |
Bonjour,
Comme le dit ska_root toutes les méthodes d'accès/extraction de données peuvent être statiques. En extraction (SELECT), tu récupères généralement un tableau, en accès (INSERT, UPDATE, DELETE) tu récupères généralement soit un boolean soit un integer. Donc le corps de ta classe peut se résumer à Code :
|
||
|
00
|
|
|
#6 | ||
|
Membre régulier
![]() Inscription : juillet 2008 Messages : 35 ![]() |
Ca reste quand même une bonne idée d'instancier les objets pour effectuer des actions ayant trait à la persistance.
L'utilisation de méthodes statiques est en général plutôt utilisée quand on a une classe "enregistreuse" séparée, qui a par exemple une méthode : Code :
L'exception est le cas où nous avons vraiment besoin de limiter au minimum nécessaire les instanciations. Je n'ai jamais rencontré un cas avec suffisamment de données pour que ce soit significatif en php. |
||
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() ![]() |
jonoz à tap tap tapoté avec ses mimines
Citation:
Quand tu faisLe sens de l'id tu l'as déjà par la classe Article. Tu sais de fait que l'id correspond à l'id d'un article, pas besoin d'instance dans ce cas et tu n'es pas perdu non plus. |
|
|
00
|
|
|
#8 |
|
Membre régulier
![]() Inscription : juillet 2008 Messages : 35 ![]() |
Le truc c'est que souvent une suppression c'est pas juste une ligne en moins dans la DB.
Tu vas procéder à des vérifications métier ou avoir des contraintes. Dans ce cas, tu vas de toutes façons instancier ton objet pour traiter ces questions (dans le cas des contraintes, tu peux laisser le SGBD s'en charger mais c'est un peu dangereux non ?) donc autant t'en servir pour faire les suppressions. Tu ne veux pas supprimer une ligne dans la DB, tu veux supprimer un objet, une entité métier. Du coup, autant manipuler une vraie entité métier, ça nous permet de tirer avantage de la POO. Le statique c'est quand même un monde à part, en php, ça permet en gros de s'affranchir de certaines contraintes de la POO. Les cas où c'est vraiment pertinent ne sont pas légion, notamment au niveau des objets métier. On s'en sert surtout au niveau des objets techniques (ex: Singleton DB - bien que discutable -, Factory et dérivés, "savers"...). |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() ![]() |
Je peux t'assurer que la quasi totalité des objets métiers peuvent être développés en static. L'idée c'est de ne jamais manipuler un enregistrement comme un objet mais comme un tableau ou un scalaire.
Ton modèle sera segmenté en Article:: Catalogue:: Fournisseur::... Une fois posé, le modèle est totalemennt statique, par contre les données qu'il devra manipuler elles sont dynamiques. Effectivement, tu peux très bien utiliser des instances pour tout mais parfois cela n'est pas nécessaire. Bref comme toujours en informatique il y a plusieurs voies pour atteindre le même résultat. |
|
00
|
|
|
#10 |
|
Membre régulier
![]() Inscription : juillet 2008 Messages : 35 ![]() |
La question n'est pas de savoir si on peut le faire, mais plutôt si c'est pertinent de le faire.
Quel est l'avantage concret d'utiliser du statique pour persister des objets métiers qui sont en général peu volumineux ? En fait, j'ai le point de vue inverse au tien : il faut utiliser du statique quand c'est nécessaire et tant que possible s'en tenir à des instances. Une des raisons qui me font penser ainsi est l'utilisation de Template Methods. Par exemple, une requête de création et une requête de mise à jour ont une grande partie commune. Du coup, en statique, tu écris trois méthodes statiques, et tu multiplies donc les appels statiques, ce qui revient dans les grandes lignes à faire du procédural...Je ne parle même pas des cas où il faut contrôler et valider les données (en gros, tous les cas...). A mon sens, le design de l'application est moins cohérent dans le sens où il s'appuie alors sur des objets techniques là où l'usage d'objets métier est à privilégier; le cas le plus désagréable étant celui où des objets métier ont quelques méthodes ou attributs statiques, ça devient juste un gros fouilli. En tout état de cause, l'intérêt de la POO est justement de manipuler autant que possible des types complexes, et non des scalaires ou des tableaux. |
|
|
00
|
|
|
#11 | |
|
Membre Expert
![]() Inscription : janvier 2006 Messages : 951 ![]() |
pendant longtemps j'ai utiliser les methodes statiques uniquement parce que les classes permettent de trier les fonctions par theme, je faisais des classes sans constructeurs et sans attribut. c'est pratique et en plus on a l'autochargement des classes qui fonctionne.
c'est le grand détournement des classes par le statiques. digression faite je relève ceci. Citation:
c'est faux. c'est faux. la preuve c'est que tu peux utiliser parent. en php4 c'était déjà possible mais c'était tordu comme syntaxe. si tu utilises php 5.3 tu vas même avoir une gestion assez fine de la surchage de n'importe quelle méthode meme en statique.
__________________
PHP fait nativement la validation d'adresse électronique Utilisez le bouton résolu! |
|
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Développeur informatique Inscription : août 2005 Messages : 1 179 ![]() |
Je pense qu'il voulait plutôt parler de polymorphisme du constructeur que de surcharge...
__________________
http://cdemarche.developpez.com/ Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
|
|
|
00
|
|
|
#13 |
|
Expert Confirmé
![]() ![]() |
Bonsoir,
@jonoz : moi je dirais plutôt : il faut utiliser du statique tant que possible et s'en tenir à des instances quand cela est nécessaire. Je le répète : le modèle une fois posé est statique, il ne fait que manipuler des données dynamiques. Donc les interactions dans le modèle sont statiques. Et au pire il est toujours possible d'utiliser des instances d'objets pour manipuler les tableaux et autres élements dynamiques. Personnellement, je développe toujours mes modèles en statique et je n'ai aucune difficulté quant à la modélisation d'élements complexes. Par contre pour ce qui est des vues, tout est géré sous forme d'instance de classe. |
|
00
|
|
|
#14 | |
|
Membre du Club
![]() Jean Frederic Nault Inscription : juillet 2010 Messages : 61 ![]() |
Citation:
la methode delete peut etre static dépendamment du contexte, mais avant d'y penser je te conseillerais de lire un peu sur le dao pattern. Comme tu dit, tu commence a faire de la poo, et pour un début cest assez bien, tu as penser a diviser le read(getLesArticles), write(oups...), delete(supprimerSql) update(miseAJourSql) Si tu détermine/précise, en debut de class, la structure de ton objet ex : var property = array(ID,titre,text...), un dao pattern sert a mapper cest dite valeur pour de façons generique creer en autre le read write del... il y a plusieur tuto sur le net sur le sujet, par la suite tu pourrais aussi séparer ton sql de ton objet au moyen dune class database tel pdo par exemple qui permet de faire de lactive record, un autre design pattern tres utilise. |
|
|
|
00
|
|
|
#15 | ||||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 15 ![]() |
Bonjour à vous,
Merci pour toutes vos réponses. @ Xysyo et jonoz : Je me rappelle être une fois tombé sur un programme où le mode de fonctionnement me surprenait, avec des choses du genre : Code :
@ gene69 : Je faisais bien référence à la notion de surcharge de constructeur. Exemple : Code :
@ nault : Je vais me documenter sur cela, merci |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com