Je viens de lire toutes les pages de cette discussion Très instructif! Ce que j'en retiens est ceci :
Interface
Une interface est un contrat que les classes qui l'implémentent doivent respecter, sinon gare...
Classe abstraite
Une classe abstraite est une classe mère qui n'est jamais instanciée. Il faut créer des classes filles qui l'étendent.
La classe abstraite propose des méthodes communes à ses classes filles qui peuvent toutefois surcharger ces méthodes si celles de la mère ne respectent pas le besoin métier.
Si la classe mère implémente une interface, les méthodes de l'interface doivent être implémentées. La classe mère peut le faire si ces méthodes sont communes à toutes les filles mais sinon, les filles doivent l'implémenter. L'interface est un contrat et tout le monde sait qu'il faut respecter un contrat sinon...
Les classes filles
Les classes filles implémentent le besoin métier. Si nécessaire, elles surchargent les méthodes de la classe mère si ces dernières ne correspondent pas à leur besoin, mais surtout, elles peuvent ajouter de nouvelles méthodes spécialisées afin d'implémenter leur métier.
Division du code
J'ai une table "personnes" dans ma SGBD. Elle contient les informations habituelles, à savoir id, nom, prénom, etc.
Je crée donc une classe "Personne" qui sait comment ajouter/modifier/détruire une personne dans la table.
Je peux également abstraire encore plus en créant des classes qui savent parler aux différents SGBDs, c.-à-d. MySql, Postgres, Sql Server, Sqlite, etc. et qui vont s'occuper du SQL particulier de chacune de ces SGBDs.
Dans ce cas, ma classe "Personne" utilise la classe Mysql pour insérer une nouvelle personne dans la table "personnes". La classe Mysql génère le SQL nécessaire à l'insertion/modification/etc. et la classe Personne s'assure de lui fournir les bonnes données et la diriger vers la bonne table dans la BDD.
Un exemple
J'ai une classe métier "Employe". Un employé est une personne. Mais elle a aussi certaines caractéristiques propres. Par exemple, no d'employé, spécialité, département, supérieur, etc.
Donc, cette classe métier correspond aussi à une table de la BDD mais elle incorpore également la table "personnes".
Dans la table "employes", j'ai donc un numéro de personne, personne_id, qui me dirige vers la bonne personne dans la table "personnes" et me donne accès à ses éléments nominatifs.
Ma classe Employe va donc créer un objet Personne, renseigner les informations correspondantes (nom,prénom,adresse,etc.) et demander à la classe Personne d'ajouter mon nouvel employé dans la table "personnes", laquelle va demander à la classe Mysql de faire le vrai travail. Par la suite, mon objet Employe va demander à l'objet Personne de lui retourner le nouvel id de cette personne et l'utiliser pour créer le nouvel employé dans la table "employes", toujours en demandant à la classe Mysql de faire le travail.
En passant, j'ai également des clients et des fournisseurs pour lesquels j'ai des contacts qui sont également des personnes. Et aussi, j'ai des utilisateurs autorisés. Ce sont également des personnes.
Et puis hier, mon supérieur m'a dit que je devais maintenant utiliser Oracle. Mais je suis têtu, je vais continuer à utiliser Mysql pendant le développement, mais en production, pas le choix, le client (une personne) exige Oracle.
Donc abstraction supplémentaire, j'ai maintenant une classe Sgbd et je l'utilise en lieu et place de la classe Mysql. Pendant le développement, $driver = 'Mysql', mais pour la production, je n'ai qu'à changer le nom du "driver", $driver = 'Oracle' et Sgbd utilisera la classe Oracle.
Je me trompe peut-être mais je ressens ici la vrai puissance du POO.
Oh et en passant, je dois maintenant écrire un système de News. J'ai des auteurs (des personnes), des modérateurs (des personnes) un administrateur (une personne) et des lecteurs (tout plein de personnes)
Chez le client 1, je dois utiliser Oracle, chez les clients 2, 3 et 4, je dois utiliser Mysql, chez le client 65 (bizarre celui-là) je dois utiliser sqlite, chez le client 756...
Depuis PHP5, c'est vraiment faisable et ça peut même être élégant...
[Question] J'ai bien compris le sens de cette discussion?
PS. Je viens de voir la date du dernier message (5 juin par Berceker United). J'espère que je ne fais pas une grosse bourde en envoyant ce message. Mais, comme je viens de passer pas mal de temps à tout lire, que la discussion est marqué importante et m'intéresse, et que je viens également de passer un bon bout de temps à écrire ce message, je l'envoie quand même. SVP faire parvenir vos flammes à quelquun@/dev/nul (bon, le mp fonctionne aussi)
Pour répondre à ta question une class abstraite serai vraiment l'idéal si vous écrivez du code utilisant différente base de donnée.
L'idée en utilisant une interface d'abstraction vous pouvez sans probléme créer une class d'abstraction qui étend une interface d'abstraction pour chaque type de base de donnée en utilisant un simple fichier de configuration pour lui attribuer ce qu'il faut.
En gros une class hérité de l'interface que vous aurez choisie qui exécuterai les fonction native pour le type de base de donnée.
Personnellement j'utilise PDO mais cela ne regarde que moi, chaque utilisateur trouve son compte dans les différentes interface proposé.
L'interface à été mi en remplacement de l'héritage multiple...
En général tu tans sert pour résoudre les problèmes de typage.
Pour bien comprendre la POO, il vous faut passer par un langage objet par exemple "Java". De plus ci par la suite tu tiens à étudier les motifs de conception, les livre sont écrit en Java...
Cela permet effectivement d'émuler un héritage multiple, mais on passe à côté de l'intérêt des interfaces si on s'en tient à cette définition.
Vues du code qui les utilise, les interfaces permettent aux classes qui les implémentent de présenter un comportement commun même si elles ne sont pas liées entre elles par une relation d'héritage.
Elles sont donc une alternative valable aux classes abstraites, quand celles-ci ne sont créées que dans le but de donner un comportement commun à des classes filles autrement indépendantes entre elles.
La POO en elle même diverge énormément suivants les langages, et tu passe à coté de pas mal de choses concernant les interfaces et abstractions...Pour bien comprendre la POO, il vous faut passer par un langage objet par exemple "Java". De plus ci par la suite tu tiens à étudier les motifs de conception, les livre sont écrit en Java...
Les nouveautés concernant la POO en PHP5 sont plus que bien accueillis, elles permettent un développement propre et sain d'application de grande taille et en équipe.
Désolé j'avais pas vu que tu t'adressais à moi.
En résumé, oui tu as trouvé le bon terme. Une classe à la responsabilité de... En respectant cette règle, cela permet de ne pas construire une classe à tout faire ou une classe qui au final n'est qu'un sac à fonctions.
Je vais prendre un exemple d'un projet ou il y avait au moins 200 classes. Je connaissais pas par cœur ces classes mais il y a eu une erreur un jour. Comme les classes avait un rôle bien précis j'ai pu de suite trouver qui était le coupable. Par contre, il ne faut pas rentrer dans l'extrémisme
Je suis assey d'accord avec la vision de seb
J'ai débuté comme pas mal dans le web et maintenant je me tue " l'open space ma tué " dans une immense SSII à faire du Java et honnetement le Java permet de mieux comprendre la POO.
Je ne dénigre en aucun cas la puissance de PHP mais le POO en php n'a pas le recul qu'a la POO en java ce qui induit, moins de doc, moins de livre, moins de best practices. Ya qu'a voir en université, généralement les cours d'UML (pattern et Reverse et des brouettes) sont généralement couplé à des TP en java.
Si je devait répondre à la question originelle qui est "les avantages de la POO en PHP".
Pour moi, ce serai:
- plus de rigueur (pas forcement un désavantage car formateur)
- maintenance plus aisé si on utilise bien le mécanisme d'exceptions
- L'appli évolue plus facilement
-> longévité accrue
-> rentabilité accrue
Business is Business
L'objet à toujours et restera assez souvent lié à Java. Il y a pas d'intérêt à parler de POO avec du PHP.
Mais c'est une politique volontaire que PHP n'ait pas autant de possibilité qu'en Java. Il faut que ce langage reste accessible d'où son succès dans le web.
Personnellement coté POO, il manque les notions de surcharge. Le typage existe à l'état réduit. Array et Object nommé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 private function toto(array $arr){} private function toto(monObjet $obj){}
L'objet est une notion, la POO est un style de programmation et non l'objet n'est pas lié à Java!
C'est plutôt Java qui en dépend et pour finir, Java est à la mode, c'est pourquoi il inonde formations, livres, conférences ...
10ans auparavant le C++ était roi, la dynastie a changé et cela continuera.
Du style POM ...
Bonjour, le topic est peu mort et c'est bien dommage....
Pour la différence entre Java/C++, je crois à mon humble avis que le Java, c'est quand même beaucoup plus simple a prendre en main. En effet, la doc est facile a trouver et sur le site de SUN, on a tout un tas d'exemple. Par contre, le C++ aura tendance à être moins gourmand...
Donc, je comprend que le Java "domine" dès que l'on parle de POO. Par contre, pourquoi ne parle-t-on pas C# ??
Pour les avantages de la POO, il faudrait en parler à mon maitre de stage qui se dit lui même développeur confirmer. Le seul problème, c'est que à part les méthodes statiques (soit disant que c'est des souvenirs de php4 parce qu'il ne gérait pas l'objet) et des classes qui héritent toutes les une des autres sans aucune organisation, il ne va pas plus loin... Bon, un extrait d'une classe (fille) qui hérite de mere :
C'est bizarre, on pouvait quand même faire meiux que ça en php4 ou alors, j'ai de mauvais souvenir de php4.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 function method($var){ $status = mere::method(fille::$config,$var); return $status; }
La seule différence, entre la version 4 et 5 est, à mon avis, la notion d'interface. Même si je les utilise pas, je pense que ça pourrait être utile...
En POO, je crois que créer un système demande beaucoup plus de réflexion... Et ensuite, c'est que du plaisir...
Patouche
@patouche: A mon humble avis, C# risque de détroner Java si ça continue comme ça... Java j'ai jamais franchi le pas, alors que C#, pour avoir fais mumuse avec, c'est quand même enfantin je trouve ! Ayant abordé le concept d'OOP par JavaScript (oui je sais c'est bizarre, mais bon... s'la faute à Dojo et co...), je me suis senti tout de suite à l'aise... alors que Java, ben rien que le nom... enfin...
Sinon en PHP, depuis que j'ai découvert la méthodologie OOP, je n'envisage pas un retour en arrière ! Code plus clair, fini les fonctions à gogo qu'on sait même plus laquelle fait quoi.
C'est sur comme dit patouche, ça demande de se poser avant, de savoir quelle classe va faire quoi, de connaître sa structure avant de commencer, bref faut concevoir avant de se lancer.
C'est peut-être aussi une question de maturité personnelle, mais oui, que du bonheur ! Changer une classe n'implique plus de ré-écrire une partie du code, et l'ajout d'interfaces est à mon avis une excellente idée ! Quand elles sont bien conçues et qu'on les respecte, c'est merveilleux (et pourtant je ne travaille pas en équipe...)
Salut tout le monde!
J'ai lu ce post en entier, et il est bien intéressant.
J'ai fais comme beaucoup d'entre vous du Java avec apprentissage de l'uml.
Mais pour un projet simple de site web, je dois dire que je fais un usage très simple de la poo en php:
Une classe mysql qui fait les accès à la base et des classes pour les différentes fonctions (fonction sur les textes, images etc.).
J'utilise ces classes de manière statique.
Donc je voulais savoir comment utiliser les concepts de la Poo autrement que pour des classes statiques, qui rendent le projet plus maintenable certe, mais qui n'utilise pas vraiment les concepts de la poo.
Merci
Je veux dire des classes qui n'ont pas besoin d'etre instancier.Qu'est-ce que tu veux dire par classes statiques ?
Comme par exemple une classe mysql qui a des methodes d'ajout/modif/suppr/ vers la bdd.
Ou un classe static qui contient un ensemble de methode.
Merci pour ton aide
Bonjour J'ai lu tout le post, par ailleurs, je me pose une question plus globale.
Le développement web en PHP5 permet d'utiliser :
- le CSS (pour le formatage)
- les fonctions (pour automatiser et éviter des redondances)
J'ai bien compris l'intérêt du POO par rapport aux fonctions en ce qui concerne la transparence et la clarté du code.
Par ailleurs, ma vision d'un objet est la suivante, et j'aimerais savoir comment y arriver avec de la POO (sauf si mon approche n'est pas la bonne) :
sur une page j'ai un champ login avec mot de passe.
Afin de pouvoir positionner cet ensemble où je le souhaite d'une page à l'autre et d'un site à l'autre sans avoir à le réécrire, sans avoir à passer par des includes ou des fonctions, puis-je passer par une ou plusieurs classe pour y arriver ?
De la même façon, j'ai besoin de définir des champs de saisie (type=text) associé à des fonctions de vérification de données (format de date, de téléphone, de mail....) en fonction de certaines variables.
Et ainsi de suite, l'objectif est de prendre mes objets et de les placer où je veux comme je veux sans avoir à m'occuper de tel ou tel fichier joint, variables dépendantes ou fonctions à inclure pour que cela fonctionne.
l'objectif est d'avoir un objet pour chaque composant de ma page, de façon à ce que tout soit modulable de façon totalement autonome.
j'ai une réalision à faire en php, l'application concerne le suivi de la gestion de scolarité d'un département d'informatique pour un mémoire de fin d'études, le problème c'est je j'apprend php ok mais je ne sais pas quoii faire pour la poo, car jai plus travaillé avec delphi,
quelqu'un peut il m'expliquer le principe du passage du modèle physique de données en php.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager