IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Conseils pour conception logicielle en php [Fait]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Points : 66
    Points
    66
    Par défaut [POO] Conseils pour conception logicielle en php
    Bonjour, je suis en train de développer un projet en php entièrement objet destiné au public d'un centre de formation pour adultes (gestion des stagiaires - parcours de formation - évaluations...). Ayant bien avancé, je me suis aperçu que mes classes avaient beaucoup de méthodes et de traitements en commun, et je me disais que le code pouvait être réduit de 50% par le biais de l'héritage. J'ai étudié la chose d'abord en java, mais impossible à mettre en place (pas de serveur assez costaud + temps de développement restreint). Je me suis aperçu que la chose était beaucoup moins facile en php. Voici par exemple une méthode statique chargée de générer la liste des éléments présents dans une table de la base de données (celles ci sont organisées par "objets-métier"): elle est présente dans chaque classe (Formation, Stagiaire, Module...). Seuls le nom de la table dans la requête et le type de l'objet instancié varient selon les classes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static function getListe() {
    		$i = 0;
    		$formations = array();
    		$sql = "SELECT id FROM formation ORDER BY libelle";
    		$query = mysql_query($sql);
    		if(mysql_num_rows($query) == 0) return null;
    		else {
    			while($datas = mysql_fetch_object($query)) {
    				$formations[$i++] = new Formation($datas->id);
    			}
    			return $formations;
    		}
    	}
    Comment placer cette méthode dans une classe parente afin qu'elle puisse être implémentée et convenir à toutes les classes filles? J'ai pensé au passage de paramètres précisant les éléments variables (requête, nom de la classe) mais je perds beaucoup du principe objet et je me rapproche d'une fonction banale.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Je crois que php n'accepte pas l'héritage multiple, et c'est bien dommage, je comprend pas pourquoi il l'ont pas introduit dans la version 5
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  3. #3
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut
    Effectivement l'héritage multiple n'est pas possible, mais il y a peut-être moyen de contourner le problème. Je n'ai pas bien compris ta structure de classe, il y a donc plusieurs classe Formation, Stagiaire, Module, et la fonction getListe() qui retourne un tableau d'objets Formation dans ton exemple elle se situe où ?

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Bonjour,

    Plusieurs possibilités existent, mais si c'est à cause du type d'objet instancié que tu coinces, il te suffit d'utiliser un pattern factory pour instancier ton objet.
    Faut que je retrouve le lien, il y a avait un bon tuto là-dessus ici-même je crois...

    Cela démontre s'il le fallait que l'héritage multiple n'est pas franchement utile, que ce soit en php ou en java.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Points : 66
    Points
    66
    Par défaut
    Voici la structure de l'application: la base de données est constituée de tables représentant chacune un objet-métier: stagiaire, formation, module, formateur... et les classes sont calquées sur ces tables: Stagiaire... Chaque classe dispose de leurs propres méthodes de traitement: getListe() pour obtenir un tableau d'objets correspondant au type souhaité, les méthodes de traitement traditionnelles concernant l'encapsulation des champs privés getID(), getNom()... Ces méthodes sont redondantes dans chaque classe à quelques mots ou variables près; je pense que si je peux "généraliser" ces méthodes à toutes les classes, ces dernières se retrouveraient allégées d'un cinquantaine de lignes de code et seraient plus lisibles pour un développeur devant éditer le programme.
    De plus, il me semble que php n'autorse pas la surcharge et la redéfinition des méthodes, ce qui n'aide pas.

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Une classe abstraite pourrait faire l'affaire aussi pour la redéfinition de méthodes (abstraites pour le coup), non ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  8. #8
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Points : 66
    Points
    66
    Par défaut
    Trés intéressant! C'est çà qu'il me faut, merci pour les liens En fait j'aimerais pouvoir effectuer des traitements communs selon une reconnaissance automatique du type d'objet (Ex: Classe->traitement() selon le type d'objet, pas forcément connu au moment du traitement)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Je viens de voir un truc interessant uniquement avec php 5, on peux surcharger les méthode __set, __get, __isset, __unset

    Surcharge en php5
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  10. #10
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par mithrendil Voir le message
    Ex: Classe->traitement() selon le type d'objet, pas forcément connu au moment du traitement
    Si la méthode traitement() existe pour toutes les classes, tu viens d'avoir besoin du pattern Strategy. Félicitations
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  11. #11
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Points : 66
    Points
    66
    Par défaut
    Le problème est que la méthode est trés légèrement différente. Si l'objet est de type "formation", la méthode de mise à jour dans la bdd utilisera une requête sql trés légèrement différente que celle utilisée pour mettre à jour un stagiaire. Je ne sais pas comment gérer ça le plus simplement possible.

    PS: merci pour le lien Eric93, même si ça à l'air assez complexe ça va me servir

  12. #12
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut
    Oui les méthodes peuvent être surchargées avec PHP5. Pour ce qui est des méthode identiques tu pourrais par exemple créer une classe baseObject dans laquelle tu met toutes le méthode communes style getId() une classe dont hériteraient les classes fillle dans lesquelle tu peux mettre des méthode personnalisées, surchargées ou non.

    Pour la question du getListe(), bien que je ne voit pas trop pourquoi un objet Formation générerait un tableau d'objet Formation tu peux remplacer le nom de la table et le nom de la classe par des $variables et appeller une méthode intermédiaire dans la classe fille qui enverra les bons paramètres à la méthode getListe() qui se trouverait dans la classe parente commune.

    Sinon as-tu déjà entendu parler de Symfony ? C'est assez facile à mettre en place.

  13. #13
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par mithrendil Voir le message
    Le problème est que la méthode est trés légèrement différente. Si l'objet est de type "formation", la méthode de mise à jour dans la bdd utilisera une requête sql trés légèrement différente que celle utilisée pour mettre à jour un stagiaire. Je ne sais pas comment gérer ça le plus simplement possible.
    Ben justement, Strategy...

    http://classes.scriptsphp.org/articl...ttern-Strategy
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  14. #14
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Points : 66
    Points
    66
    Par défaut
    Est ce qu'il existe en php une méthode permettant à une classe parent de connaitre la nature de la classe fille utilisant ses méthodes? Je m'explique:

    Interface "Base":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    interface Base 
    {
    	public static function getListe($object);
    };
     
    ?>
    Classe "Main":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Main implements Base
    {
    	public static function getListe($object) {
    		$i = 0;
    		$array = array();
    		$sql = "SELECT id FROM $object ORDER BY id";
    		$query = mysql_query($sql);
    		if(mysql_num_rows($query) == 0) return null;
    		while($fetch = mysql_fetch_object($query)) {
    			$array[$i++] = new $object($fetch->id);
    		}		
    		return $array;
    	}
            ....
    Classe "Formation":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Formation extends Main
    {
          public function __construct($id) {
          .....
    Si j'appelle Formation::getListe(), comment remplacer la variable $object de la méthode getListe() par "formation" par exemple? Excusez moi mais je crois que j'ai un peu de mal à comprendre le principe de fonctionnement des design pattern, peut être est ce en effet la solution?

  15. #15
    Membre régulier Avatar de daajack
    Inscrit en
    Octobre 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 97
    Points : 97
    Points
    97
    Par défaut
    Dans ce cas, ce que tu peux faire c'est une méthode dans la classe Formation dans ce goût :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Formation extends Main
    {
      public function __construct($id) {
      .....
      public function getListe() {
        return parent::getListe('Formation');
      }
      .....
    }
    Avec la méthode getListe() dans la classe Main en protected.
    Ça devrait marcher, mais il se peut qu'il y ait un problème d'argument, dans ce cas il faut mettre un nom différent au lieu de surcharger.

Discussions similaires

  1. [POO] conseils pour creation site en PHP Objet
    Par Clorish dans le forum Langage
    Réponses: 8
    Dernier message: 05/06/2008, 23h18
  2. Demande de Conseils pour migrer php4 vers php 5
    Par Apprentilinux dans le forum Langage
    Réponses: 1
    Dernier message: 31/03/2008, 19h06
  3. [POO] Conseils pour implémentation d'un catalogue
    Par SPKlls dans le forum Langage
    Réponses: 2
    Dernier message: 24/01/2008, 00h06
  4. conseil pour conception de base
    Par karidrou dans le forum Modélisation
    Réponses: 1
    Dernier message: 16/01/2007, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo