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 :

Conception POO en php


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 85
    Points : 62
    Points
    62
    Par défaut Conception POO en php
    Bonjour,

    j'essaie de me mettre à la POO avec php, et je rencontre un petit soucis de conception...

    J'ai une classe "cellule" qui contient une une méthode abstraite "display".
    Cette méthode est abstraite car elle doit être redéfinie selon ce qu'on met dans cellule.

    J'ai d'autre part une classe "liste".

    Je souhaiterais que cette classe "liste" contienne un membre de la classe "cellule".

    Dans l'esprit, j'aurais donc quelque chose comme:
    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
    21
     
    abstract class cellule {
        protected $value;
        /* @var dlist_cell */
        protected $next;
        /* @var dlist_cell */
        protected $previous;
     
        abstract public function display();
    }
     
    class liste {
        /* @var cellule */
        protected $sentinel;
        protected $len;
     
        public function __construct() {
            $this->sentinel = new cellule();
            $this-len = 0;
        }
    }
    Or je ne peux pas instancier une classe abstraite.

    Comment concevoir / modéliser ce genre de chose?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Je dirais que le mieux c'est que tu n'utilises pas directement la classe cellule().
    Il faudra par exemple créer une classe qui héritera de cellule() ensuite l'utiliser dans liste().

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 85
    Points : 62
    Points
    62
    Par défaut
    Oui, mais justement...
    Je souhaite que "liste" fonctionne avec n'importe quelle classe dérivée de "cellule"
    Si je précise la classe dans "liste", alors elle n'est a priori plus aussi générique...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    OK mais l’intérêt d'une méthode ou classe abstraite c'est puisse être utilisé et modifier par d'autres classes selon les besoins.
    Est ce que ça ne serait pas mieux que tu déclare la classe "cellule" comme abstraite vu qu'elle contient une méthode abstraite.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 85
    Points : 62
    Points
    62
    Par défaut
    mmmm...
    Je ne suis pas sûr de comprendre...
    Dans mon exemple de code, la classe "cellule" est en effet déclarée abstraite car elle contient une méthode abstraite.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Désolé j'avais pas vu l'abstract dans:Une classe abstraite ne peut pas être instancié, les classes filles le sont.

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Utilise l'injection de dépendance (qui est d'ailleurs préférable à l'utilisation de "new" dans le constructeur) en créant l'objet sentinelle en-dehors de la classe liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function __construct(cellule $sentinel) {
            $this->sentinel = $sentinel;
            $this-len = 0;
        }
    tu crées ensuite une (ou plusieurs) classe concrète qui hérite de cellule, et tu passes une instance de cette classe dans le constructeur de liste, ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class CelluleA extends cellule {
        public function display() {
        }
    }
     
    $cellule_a = new CelluleA;
     
    $liste = new Liste($cellule_a);
    De cette manière, tu peux utiliser n'importe quelle classe concrète héritant de cellule dans liste.

    Petite remarque, l'usage en PHP est de nommer les classes avec une majuscule au début, par exemple Cellule ou Liste pour que l'on distingue immédiatement que c'est une classe et non d'autres identifiants.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 85
    Points : 62
    Points
    62
    Par défaut
    Instinctivement, j'aurais pensé qu'il fallait que ce soit défini dans la classe.
    Passer par une "injection de dépendance" me semble moins "carré", mais je n'y connais pas grand chose en poo, et m'en remets à toi!

    Du coup ça veux dire que je ne suis pas sûr que le classe que je passe par injection dispose effectivement d'une méthode display().
    N'est-ce pas problématique?

    Merci

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    - L'injection de dépendance est plus flexible, plus robuste, plus testable, bref meilleure que créer l'objet dans la classe, pour des tas de raisons qui ont été présentées depuis des décennies, et qu'une recherche Google te permettra de retrouver. Je ne m'étendrai donc pas sur ce sujet :-)

    - La signature du constructeur est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function __construct(cellule $sentinel)
    Ça signifie que le constructeur acceptera seulement des objets héritant de cellule (puisqu'on ne peut pas utiliser cellule directement car elle est abstraite). Comme tous les héritiers de cellule doivent implémenter la méthode display(), tu es sûr à 100% que tous les objets passés disposent de la méthode display();

    Si tu essaies de passer autre chose, tu auras un message de ce genre, par exemple si on passe un objet stdClass
    Fatal error: Uncaught TypeError: Argument 1 passed to Liste::__construct() must be an instance of Cellule, instance of stdClass given

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 85
    Points : 62
    Points
    62
    Par défaut
    Merci beaucoup pour ton aide!

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    N'oublie pas de marquer le fil comme résolu si ton problème a été résolu :-)

Discussions similaires

  1. [PHP 5.0] [conception] Un projet php (POO-BDD-Ajax-CSS)
    Par cryptom dans le forum Langage
    Réponses: 3
    Dernier message: 10/04/2009, 01h41
  2. [POO] Conseils pour conception logicielle en php
    Par mithrendil dans le forum Langage
    Réponses: 14
    Dernier message: 07/02/2008, 17h19
  3. [Conception] Débuts en PHP & SGBD
    Par qnop dans le forum PHP & Base de données
    Réponses: 32
    Dernier message: 17/03/2006, 20h18
  4. [POO] POO et PHP
    Par toure32 dans le forum Langage
    Réponses: 2
    Dernier message: 17/12/2005, 00h37
  5. [POO] Env PHP 5
    Par yanis97 dans le forum Langage
    Réponses: 8
    Dernier message: 09/11/2005, 17h16

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