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 :

Variabiliser le nom d'une méthode [PHP 5.6]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Par défaut Variabiliser le nom d'une méthode
    Bonjour à tous,

    J'ai plusieurs méthodes pour afficher une désignation dans différentes langues

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $object->getDesignationFr()
    $object->getDesignationEn()
    La langue en cours en stockée dans une variable $lang

    Lors de l'appel à ces méthodes, voilà ce que je fais pour avoir la bonne langue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $method = "getDesignation".ucfirst($lang);
    echo $object->$method();
    Ce n'est pas très élégant, n'y a t'il pas un moyen de tout faire tenir en une seule ligne ?
    Une sorte de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $object->"getDesignation".ucfirst($lang)
    Mais qui fonctionne

    Merci !

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Ne serait-il pas plus propre et de refactorisé le code et d'ajouter une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    public function getDesignation($lang){
     
        if($lang == 'fr'){
            return $this->getDesignationFr()
        }
        if($lang == 'en'){
            return $this->getDesignationEn()
        }
        return   $this->getDesignationDefault() 
    }

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    t'es sûr du design de tes classes d'internationalisation ? Parce que créer une méthode par langue pour avoir la traduction c'est sacrément bancal.
    Sinon tu peux faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call_user_func([$object, 'getDesignation'.ucfirst($lang)]);

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    la langue est commune à tous les attributs de la classe. ainsi la langue sera aussi attribut de ladite classe pour pouvoir renseigner la langue une seule fois au moment de l'instanciation de la classe.
    A l'instanciation, on invoque n'importe quelle méthode de MyObject sans se préoccuper de la langue ce qui laisse à la vue sa vrai responsabilité celle d'afficher les données sans introduite des conditions.


    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
    22
    23
    24
    25
    26
     
    class MyObject {
     
        private $designation; // désignation avec la langue par défaut(fr par exemple)
        private $designationEn;
        /**
         * @var null|string
         */
        private $lang;
     
     
        public function __construct(?string $lang ='fr' ) {
            $this->lang = $lang;
        }
     
        /**
         * @return string
         */
        public function getDesignation():?string {
            return
                substr($this->designation, -2) != $this->lang ?
                    $this->designation: $this->designation.ucfirst($this->lang) ;
        }
     
     
    }
    Certainement une classe abstraite définissant la langue comme attribut(au lieu de le faire dans MyObject) laquelle classe serait un modèle pour une classe comme MyObjet serait bien plus intéressante.

  5. #5
    Membre confirmé Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Par défaut
    Effectivement je vais revoir le code ma classe.
    Merci beaucoup !

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Et avec des accolades ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $object->{"getDesignation".ucfirst($lang)}()
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre confirmé Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Par défaut
    Citation Envoyé par Celira Voir le message
    Et avec des accolades ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $object->{"getDesignation".ucfirst($lang)}()
    Et bien cela marche !
    Merci Celira

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/04/2016, 10h51
  2. récupérer le nom d'une méthode
    Par awalter1 dans le forum Général Python
    Réponses: 13
    Dernier message: 30/01/2012, 08h53
  3. Récupérer le nom d'une méthode
    Par artmicro dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2011, 11h12
  4. Modifier le nom d'une méthode
    Par smyley dans le forum Framework .NET
    Réponses: 2
    Dernier message: 02/11/2008, 22h03
  5. appeller une méthode dans le nom est dans un String
    Par fxjtarga dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2006, 16h06

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