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 :

[débutant en POO]mettre à disposition une donnée [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 385
    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 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut [débutant en POO]mettre à disposition une donnée
    Bonjour,
    mon souci est sûrement celui de qui n'y connait presque rien en POO...
    En gros, je gère des fichiers CSV. J'ai une classe (CSVParser) chargée du parsage et qui met les données (data) dans un attribut. Mon souci est que pour y accéder, je dois instancier un objet de la classe CSVParser puis exécuter la méthode qui alimente data. Autrement dit, si N classes ont besoin d'accéder à data, ça fait N objets de type CSVParser et N appels à la méthode qui alimente data. Je voudrais appeler la méthode qui alimente data une seule fois et ne pas créer ces N objets de type CSVParser. Dans mes souvenirs (vagues), la classe CSVParser doit posséder un attribut référent et si une autre classe a besoin d'accéder à data, il faut utiliser ce référent. Mais j'ai du mal à retrouver le mécanisme. Une explication (avec un exemple) serait bienvenue...
    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
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    J'ai une classe (CSVParser) chargée du parsage et qui met les données (data) dans un attribut. Mon souci est que pour y accéder, je dois instancier un objet de la classe CSVParser puis exécuter la méthode qui alimente data.
    Ok.

    Autrement dit, si N classes ont besoin d'accéder à data, ça fait N objets de type CSVParser et N appels à la méthode qui alimente data.
    Pas forcément.

    Disons qu'on ait une classe CSVParser dans ce goût-là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class CSVParser
    {
        protected $data;
        public function __construct($CSVPath) {
            $this->data = $this->readCSV($CSVPath);
        }
     
        private function readCSV($CSVPath) {}
     
        public function getData() {
            return $this->data;
        }
    }
    (à vrai dire ce à quoi elle ressemble vraiment n'a pas d'importance, c'est juste pour fixer les idées.)

    Toi tu vois les choses comme ça (en schématisant):
    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
     
    class A
    {
        public $data;
        public function __construct($arg1, $arg2, $CSVPath) {
            $csv = new CSVParser($CSVPath);
            $this->data = $csv->getData();
        }
    }
     
    class B
    {
        public $data;
        public function __construct($arg1, $arg2, $CSVPath) {
            $csv = new CSVParser($CSVPath);
            $this->data = $csv->getData();
        }
    }
     
    // etc.
    et là effectivement, à chaque instanciation de A, B ou C ou Z, il y a bien création d'une nouvelle instance de CSVParser.

    Mais rien ne t'oblige à mettre l'instanciation de CSVParser au sein des autres classes (c'est d'ailleurs déconseillé car ce faisant, tu vas aboutir à une nouvelle forme de code spaghetti où chaque classe va dépendre d'une autre classe). Tu peux utiliser ce qu'on appelle l'injection de dépendance qui consiste tout simplement à passer un objet déjà construit (une instance) à la classe qui en a besoin:
    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 A
    {
        public $data;
        public function __construct($arg1, $arg2, CSVParser $csv) {
            $this->data = $csv->getData();
        }
    }
    // ... idem avec d'autres classes
     
    $csv = new CSVParser($path);
     
    $a1 = new A('truc', 'bidule', $csv);
    $a2 = new A('machin', 'chose', $csv);
    $b = new B('bitoniau', 'zigouigoui',  $csv);
    Et là j'ai bien une seule instance de CSVParser avec trois instances d'autres classes qui en disposent.

    Mieux encore si les classes A, B, C n'ont besoin que des data produites par CSVParser, autant ne leur passer que les data en question, car après tout elles n'ont que faire de leur provenance.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    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 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Mieux encore si les classes A, B, C n'ont besoin que des data produites par CSVParser, autant ne leur passer que les data en question, car après tout elles n'ont que faire de leur provenance.
    En effet, c'est ultra simple (et déjà implémenté). Seulement, je ne voyais pas cette simplicité. Ca vient sûrement de mon grave accident de l'an 2000, qui m'a grillé des neurones J'avais eu un traumatisme crânien (dont j'ai réchappé par miracle (un mois de coma)) et depuis, je suis handicapé...(ça ne m'a pas empêché d'apprendre le PHP (procédural)(vers 2006 ou 7), fortement aidé par mon background de développeur logiciel)

    [EDIT] merci de m'avoir aidé, car si je pose souvent des questions bateau, c'est après avoir fait une recherche (Google et DVP)(probablement mal faite )...
    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. [MySQL] Mettre à jour une donnée lorsqu'une autre se met à jour
    Par geeksfaction dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 26/02/2017, 06h03
  2. [AC-2010] Mettre à disposition une table d'une base access
    Par Nelson77 dans le forum VBA Access
    Réponses: 5
    Dernier message: 25/09/2013, 19h59
  3. mettre à disposition une séquence vidéo
    Par marcel marie dans le forum Vidéo
    Réponses: 3
    Dernier message: 31/12/2009, 11h45
  4. [MySQL] Mettre à jour une donnée d'après une date
    Par padodanle51 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/06/2009, 11h48
  5. [DOM] Mettre à jour une données dans un noeud
    Par eexit dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/08/2007, 14h23

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