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 :

Fluence dans l'appel de librairies de classe, classes abstraites, interfaces, ou traits depuis un objet [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de devEric69
    Homme Profil pro
    Dév. Lazarus & C++, Php - Windows & Ubuntu
    Inscrit en
    Novembre 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dév. Lazarus & C++, Php - Windows & Ubuntu
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 74
    Points : 121
    Points
    121
    Par défaut Fluence dans l'appel de librairies de classe, classes abstraites, interfaces, ou traits depuis un objet
    Bonjour,

    J'ai une question pour améliorer la sémantique de mon code. Je débute souvent mes développements en regroupant les fonctions dans des librairies de Classes, de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Foo1Utils  {    
        //Csttes de classe
        public static $csPrenom = 'Paul';
        public static $csNom = 'Dupont';		
        static public function crie() {
            echo 'Je suis '.$csPrenom.' '.$csNom;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Foo2Utils  {    
        //Csttes de classe
        public static $csPrenom = 'Alain';
        public static $csNom = 'Dupond';		
        static public function sappelle() {
            echo 'Je suis '.$csPrenom.' '.$csNom;
        }
    }
    Maintenant, je souhaiterais créer une classe - mettons Bar - permettant de créer un objet $oBar dans lequel je puisse appeler Foo1Utils::crie() et Foo2Utils::sappelle(). Je souhaiterais que Foo1Utils et Foo2Utils deviennent des fichiers utilisables dans le code, seulement par la classe Bar. Et grammaticalement, je voudrais ajouter une fluence d'indirection de la façon suivante:
    $oBar->Foo1Utils::crie() et $oBar->Foo2Utils::sappelle(), voire mieux i.e. $oBar->foo1->crie() et $oBar->foo2->sappelle().

    Alors, je me suis dis que je pourrais commencer par modifier Foo1Utils et Foo2Utils en 2 classes abstraites, ou 2 interfaces, ou en 2 Traits, pour m'obliger à les appeler explicitement depuis la classe Bar, les réclamant ainsi pour les injecter\utiliser\implémenter. Mais cela aboutit sur $oBar->crie() et $oBar->sappelle .

    Comment faites-vous pour faire ce genre de réfection sémantique avec de la grammaire Php?

    Cordialement.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 440
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    du moment que la classe Foo1Utils est déclarée, vous pouvez appelez directement la méthode statique Foo1Utils::crie() sans passer par une autre classe.

  3. #3
    Membre régulier Avatar de devEric69
    Homme Profil pro
    Dév. Lazarus & C++, Php - Windows & Ubuntu
    Inscrit en
    Novembre 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dév. Lazarus & C++, Php - Windows & Ubuntu
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 74
    Points : 121
    Points
    121
    Par défaut
    Bonjour @mathieu,

    je ne comprends pas vraiment la réponse.
    Pour re-phraser ma question, je souhaiterais savoir s'il existe un moyen de stocker dans 2 champs\variables de la class Bar, Foo1 et Foo2 (ex-Foo1Utils et ex-Foo2Utils) qu'ils soient faits plutôt sous la forme de 2 librairies de classe (comme déjà existantes actuellement), de 2 interfaces, de 2 traits, ou sous une autre forme que je connais pas. Ça n'est pas être pas encore possible (la seule méthode que je connaisse pour l'instant en Php est celle qui consiste à créer 2 vrais objets encapsulés des types Foo1 et Foo2 dans le constructeur de Bar, et stockés donc dans ses champs). J'en reste là?

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 440
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    ce que je ne comprends pas dans votre question, c'est pourquoi vous cherchez a exécuter le code de "Foo1Utils" en passant par la classe "Bar" alors que la méthode Foo1Utils::crie() peut être appelée directement.
    peut-être auriez vous un exemple avec des noms des classes réelles pour que je me représente mieux ce que vous cherchez à faire ?

  5. #5
    Membre régulier Avatar de devEric69
    Homme Profil pro
    Dév. Lazarus & C++, Php - Windows & Ubuntu
    Inscrit en
    Novembre 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dév. Lazarus & C++, Php - Windows & Ubuntu
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 74
    Points : 121
    Points
    121
    Par défaut
    Pour une raison de réduction des appelables possibles par l'interpréteur i.e. pour m'obliger maintenant à penser que "ha oui, les méthodes de Foo1 et de Foo2 ne sont connues que depuis, par, et dans une classe Bar maintenant!".

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Ce que tu souhaites faire n'est pas possible en l'état puisque tes classes utilitaires sont static.
    La solution simple c'est d'en faire des classe instanciables ce qui permettrait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    class Bar 
    {
        public Util1 $util1;
     
        public function construct(Util1 $u1) {
            $this->util1 = $u1;
        }
    }
     
    $bar = new Bar($u1);
    $bar->util1->fct();
    Le problème de faire ca c'est que ta classe util1 peut être instanciée de n'importe où , ce qui ne semble pas être ce que tu veux.
    Si tu instancies la classe dans Bar , tu créer un couplage fort et c'est à éviter absolument.

    Les traits pour faire ça ne reviendrait qu'à faire de l'héritage fonctionnel et ca c'est caca

    Une interface répond à ta problématique de
    pour m'obliger maintenant à penser que "ha oui, les méthodes de Foo1 et de Foo2 ne sont connues que depuis, par, et dans une classe Bar maintenant
    mais ca t'oblige à redéfinir les méthodes partout où tu en aurais besoin.
    Et une fois encore il faut éviter de tomber dans l'implémentation qui n'a d'autre sens qu'apporter des fonctionnalité dénuée de logique dans l'objet actuel.

    En général on essai de limiter au maximum les responsabilité des classes , vouloir imposer l'utilisation d'un classe au travers d'une autre va, à mon sens, à l'encontre de ce principe.
    J'avoue ne pas bien comprendre l'intérêt de ce que tu veux faire. Un exemple concret dans un autre langage peut être ?

  7. #7
    Membre régulier Avatar de devEric69
    Homme Profil pro
    Dév. Lazarus & C++, Php - Windows & Ubuntu
    Inscrit en
    Novembre 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dév. Lazarus & C++, Php - Windows & Ubuntu
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 74
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par grunk Voir le message

    [snip] Le problème de faire ca c'est que ta classe util1 peut être instanciée de n'importe où , ce qui ne semble pas être ce que tu veux.
    Si tu instancies la classe dans Bar, tu créer un couplage fort et c'est à éviter absolument.
    Bonjour, effectivement le couplage fort est à éviter en règle générale. Mais je suis maintenant dans une phase où je souhaite stabiliser au plus, terminer un projet - pas un framework - aux frontières maintenant définies précisément. Donc, en fait, je recherche dans ma demande d'exemple, du couplage fort.

    Citation Envoyé par grunk Voir le message
    Une interface répond à ta problématique mais ca t'oblige à redéfinir les méthodes partout où tu en aurais besoin.
    Et une fois encore il faut éviter de tomber dans l'implémentation qui n'a d'autre sens qu'apporter des fonctionnalité dénuée de logique dans l'objet actuel.

    En général on essai de limiter au maximum les responsabilité des classes , vouloir imposer l'utilisation d'un classe au travers d'une autre va, à mon sens, à l'encontre de ce principe.
    J'avoue ne pas bien comprendre l'intérêt de ce que tu veux faire. Un exemple concret dans un autre langage peut être ?
    J'essaie de reproduire quelque chose au plus près de ça: https://forum.lazarus.freepascal.org...html#msg328478 (i.e. créer au plus simple, si c'est possible, une propriété nommée qui est une indirection vers une interface). Vous feriez comment?

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Vous feriez comment?
    je ferais pas

    A ma connaissance il n'existe pas de mécanisme en PHP pour faire ça. on va donc forcément se diriger vers une solution un peu bricolage.

    Une solution possible :
    Classe utilitaire instanciable.
    On doit lui passer en paramètre une instance d'objet bien particulier.
    Si cette condition n'est pas remplie on échoue

    Ca se matérialisera donc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Foo implements WithUtil 
    {
        public initUtil() {
            $this->util = Util1::getInstance($this); // J'imagine qu'un singleton est adapté ici
        }
    }
    Les traits sont effectivement aussi une solution , si on veux les utiliser comme une sorte d'héritage multiple.

    Mais je suis maintenant dans une phase où je souhaite stabiliser au plus, terminer un projet - pas un framework - aux frontières maintenant définies précisément
    Je ne connais pas le projet mais à aucun moment le métier ou la stabilisation sont des justifications pour introduire des concepts qui créer de la dette technique et dégrade la qualité du code.

    Si c'est un concept qui existe en pascal et pas en PHP , il ne faut pas essayer de le reproduire , mais simplement concevoir différemment.

  9. #9
    Membre régulier Avatar de devEric69
    Homme Profil pro
    Dév. Lazarus & C++, Php - Windows & Ubuntu
    Inscrit en
    Novembre 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dév. Lazarus & C++, Php - Windows & Ubuntu
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 74
    Points : 121
    Points
    121
    Par défaut
    Ok, merci pour la réponse. Finalement, je me suis dirigé vers la solution simple i.e. transformer mes librairies de Classes "utils" pour en faire des classes instanciables et encapsulées comme suggéré: ça fait l'affaire avec des... ou... dans leurs méthodes au cas par cas.

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

Discussions similaires

  1. Classe Abstraite / Interface
    Par Mornor dans le forum Général Java
    Réponses: 6
    Dernier message: 08/12/2013, 16h19
  2. Classe abstraite ? Interface ?
    Par Gaetch dans le forum Modélisation
    Réponses: 1
    Dernier message: 17/10/2010, 20h45
  3. Réponses: 3
    Dernier message: 03/11/2008, 22h01
  4. appeler une librairie .so dans une classe
    Par tet.dum dans le forum Langage
    Réponses: 8
    Dernier message: 31/10/2006, 10h34
  5. Classe Abstraite, Interface....
    Par greatdonking dans le forum Langage
    Réponses: 6
    Dernier message: 07/11/2005, 17h19

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