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 :

Méthode statique ou que des objets ? [POO]


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 335
    Points : 5 704
    Points
    5 704
    Billets dans le blog
    1
    Par défaut Méthode statique ou que des objets ?
    Bonjour,

    je m'interroge sur ce choix de conception : dans une architecture MVC, les classes du modèle peuvent-elles comporter des méthodes statiques ?
    En clair, je souhaite créer une méthode qui interrogerait la bdd pour obtenir la liste des utilisateurs. Donc du genre public function getUser():array, le tableau retourné étant la liste des utilisateurs. Cette méthode appartient à la classe User. A priori, c'est une méthode générique, donc pas liée à un utilisateur particulier, donc il me semble logique qu'elle soit statique. Quel est votre avis ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Rien ne l'interdit.

    Maintenant si ton modèle est une représentation stricte d'un utilisateur ce n'est pas forcément le bon endroit pour mettre cette fonction.
    Si au contraire ton modèle est une classe une peu générique et qui touche tout ce qui concerne le ou les utilisateurs alors pourquoi pas.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 842
    Points : 6 522
    Points
    6 522
    Par défaut
    À mon avis, ça n'a rien à faire dans ta classe User pour une raison simple: ta classe User réunit les attributs et méthodes nécessaires à la manipulation d'un utilisateur pas d'un ensemble d'utilisateurs.
    À ta place je créerais une classe UserCollection avec des méthodes utiles pour gérer un ensemble d'instances de User dont une méthode non-statique qui te renvoie sous une forme ou une autre l'ensemble des utilisateurs d'une instance. Une instance d'une telle classe peut regrouper un, deux, vingt ou tous les utilisateurs de ta base ça n'a aucune importance.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 335
    Points : 5 704
    Points
    5 704
    Billets dans le blog
    1
    Par défaut
    Merci pour les réponses, et ça tombe bien car j'avais fini par faire la même réflexion ; j'avais créé une deuxième classe (que j'ai renommée car la proposition de Cosmo est mieux) : TicketModelCollection et cette classe comporte des méthodes non statiques...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    Bonjour,

    L'approche utilisant les méthodes statiques est une implémentation assez courante du pattern ActiveRecord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $users = User::findAll(); //liste
    $user = User::findOne( $id ); //un utilisateur
    $user->save();
    $user->delete()
    C'est très pratique; le code est simple et lisible, et cela permet de regrouper toutes les méthodes de manipulation du modèle dans une classe et évite d'avoir à créer deux classes pour chaque modèle.

    C'est par exemple l’approche suivie par le framework Yii.

    Je suis parti sur cette approche dans mon framework/CMS. Tous mes modèles étendent une classe de base ActiveRecord, qui contient les méthodes statiques permettant de récupérer les objets.

    Mais effectivement, l'utilisation de méthodes statiques pour récupérer des objets est très controversée.

    D'une manière générale le pattern ActiveRecord est très décrié. Certains considèrent qu'il va à l’encontre des bonnes pratiques de POO et qu'il s'agit d'une violation du principe de responsabilité unique. L'utilisation de méthodes statiques peut également poser problème pour l'injection de dépendances.

    Tout dépend de tes objectifs. Généralement on considère que c'est adapté à des applications assez simples.

    Si tu décides de séparer les fonctionnalités avec 2 classes, je te conseillerais d'avoir une classe Finder qui contient les méthodes pour récupérer les utilisateurs, plutôt qu'une classe UserCollection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $userFinder = new UserFinder();
    $users = $userFinder->findAll(); //liste
    $user = $userFinder->findOne( $id );
    $user->save();
    $user->delete()
    Mais quitte à créer deux classes, tu pourrais passer à une approche de type DataMapper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //Entité User : gère toute la logique métier de l'utilisateur, mais pas la persistence.
    class User {
    //...
    }
     
    //UserMapper : gère la récupération des objets ou la sauvegarde en base de données :
    class UserMapper {
    public function findOne() {
    //...
    }
    public function save(User $user) {
    //...
    }
     
    $userMapper = new userMapper();
    $users = $userMapper->findAll(); //liste
    $user = $userMapper->findOne( $id ); //un utilisateur
     
    $userMapper->save( $user );
    $userMapper->delete( $user )

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 335
    Points : 5 704
    Points
    5 704
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    mon approche est différente de celles que tu proposes : certes, j'ai 2 classes, mais en gros le principe est le suivant :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class User {
    //  gère la logique métier et l'écriture en bdd
    }
     
    class UserCollection {
    //gère la lecture en bdd
    }
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Utilisation de la méthode "Add" pour ajouter des objets.
    Par LIANAZEL dans le forum C#
    Réponses: 9
    Dernier message: 09/06/2016, 14h59
  2. Comment faire que des objets 3D ne se touchent pas dans une scène.
    Par ibrakola dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 16/05/2012, 02h40
  3. Réponses: 5
    Dernier message: 09/10/2009, 18h21
  4. Méthode JS qui crée des objets dont le nom est recu en paramètre
    Par power of mind dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/07/2009, 14h44
  5. [PHPTAL] gestion des méthodes des Objets
    Par ronio dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 06/03/2006, 15h29

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