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 :

[POO] Appeler une fonction par son nom dans une variable [Fait]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut [POO] Appeler une fonction par son nom dans une variable
    Hello,

    J'ai une fonction définie par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function getTabID()
    {
    }
    Ce que je souhaiterai serait d'avoir un tableau de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tabfct = array(0=>'getTabId')
    Par la suite je voudrais appeler ma fonction par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $fonction = $tabfct[0];
    $fonction();
    Comment faire pour avoir un truc similaire ? (si c'est possible)

    Merci de votre aide.

  2. #2
    Membre actif Avatar de Gaara-Manga
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Avril 2007
    Messages : 247
    Points : 239
    Points
    239
    Par défaut
    A ma connaissance cela n'est pas possible.

    Quand tu appelles ton tableau tu appelles des chaines ou des entiers ou des booléens,etc... mais tu n'appelles pas de fonction.

  3. #3
    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
    Bonjour,

    Un truc comme ça ?
    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
     
    <?php  
     
    function classic()
    {
    	return 'The style is classic ';
    	}
     
    function baroque()
    {
        return 'The style is baroque ';
    	}
     
    function romantic()
    {
       return 'The style is romantic ';
       }
     
    $styles = array('classic','baroque','romantic');
     
    foreach($styles as $style)
    {
       $stylefunction = $style;
       echo $stylefunction().'<br />';
       }
    ?>

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Merci infiniment !!!! Là tu me sauve la vie, je ne trouvais pas les mots clés appropriés sur google : tu tappes "tableau+fonction", c'est mort !!!

    Merci encore, j'ajoute ce post dans mes favoris!!!

    Je cloture ce post mais j'ai une question hors sujet : que signifie cette écriture :
    Je rencontre souvent ce code mais je vois pas ce que ça signifie.

    Au cas ou qq repasse par ici, en attendant merci.

  5. #5
    Membre actif Avatar de Gaara-Manga
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Avril 2007
    Messages : 247
    Points : 239
    Points
    239
    Par défaut
    A jcroyais pas sa possible jcrois que sa pourrais bien mservir également^^

    Merci Tsilefy

  6. #6
    Membre averti Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut
    Citation Envoyé par whitespirit Voir le message
    Je rencontre souvent ce code mais je vois pas ce que ça signifie.


    C'est de l'objet en fait

    Tu crées une classe dans laquelle tu peux ajouter plusieurs fonctions et/ou variables fonctions de fonctions et du coup, pour les utiliser, on fait d'abord un '$maClass = new maClass()'

    et ensuite on peut récupérer tout ce qui est à l'intérieur :
    '$maClass->$variable' va récupérer la variable '$variable' située dans la classe 'maClass'
    de même, si tu as une fonction 'mafonction' située dans 'maClass', tu l'appelles comme ceci :
    $maClass->mafonction();
    symfony power user !

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Oui mais si je fais
    je récupère la variable définit comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class maClass{ private $mavariable;}
    Et si je fais , étant donné que j'ai le $ devant mavariable, je récupère quoi ?

    C'est le fait d'avoir 2 $ qui me gènes...

  8. #8
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    si tu as une variable qui est initialisé dans ta classe. tu dois l'appeler par l'opérateur directionnel '->', sans le $ sur la variable.

    comme ceci donc :

    $maclasse->mavariable

    en objet on appelle plus communément une fonction, une méthode. et une variable une propriété

    PS : dans ton exemple, ta propriété mavariable est privé. tu peux te brosser pour la récupérer , cela dit c'est correct. il te faut donc avoir une méthode qu'on apellerais getMavariable() { echo $this->mavariable }
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

  9. #9
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    $maclasse->$mavariable
    En effet, à ma connaissance, quand je fais une erreur de frappe en ajoutant le '$' mal placé avant le nom du membre (ou propriété) de la classe, php me retourne un code d'erreur.
    PHP Fatal error: Cannot access empty property
    Donc la bonne façon pour accéder à un membre est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class mon_Obj{
      var   $mavariable;
    }
     
    $maclasse = new mon_Obj();
     
    $maclasse->mavariable = 30;
    echo $maclasse->mavariable;
    Regarde un tuto sur POO (programmation Orientée Objet) avec php (Ya peut être mieux, mais s'est assez concentré.
    ----
    L'avenir appartient à ceux dont les salariés se lèvent tôt.

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Merci de vos explications. En fait je connais la POO, mais je suis tombé sur ce type code qui fonctionnait. Mais vous avez raison, c'est relatif au php, je vais relire tout ça.

  11. #11
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Voilà j'ai la réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function Cumul($tab, $src, $dest){
    	
    	foreach($tab as $key => $value){
    			
    		echo $key."=>".$value->$src."<br>";
    			
    		$this->tab_H_Taux[$dest] += $value->$src;
    	}
    }
    Il y a peut être plus simple mais, ceci fonctionne.
    Dans ce cas, $tab est un tableau d'objet la boucle te permet de récupérer $value qui est l'index de l'objet et dans ce cas la variable $src que je passe en paramètre est le nom de la propriété dont je veux récupérer la valeur.

    En un mots, $value->$src te retourne la valeur de la propriéte $src de l'objet $value dans la mesure ou $src="le_Nom_Propriete" est un membre connu de l'objet.

    Je ne sais pas si je suis claire ?
    ----
    L'avenir appartient à ceux dont les salariés se lèvent tôt.

  12. #12
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    merci,

    En fait c'est ce que j'avais besoin. J'ai un tableau qui empilent des fonctions représentant une clause WHERE à une position. Du coup, je peux "facilement" faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			$nameFonction = $this->_FILTER->GetFilterElementName($position);			
    			return $this->$nameFonction();
    Et ça marche !!! C'est cool !

  13. #13
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Je suis content d'avoir pu t'aider, mais à mon tour j'ai une question pour ma culture personnelle. Pourrais tu m'expliquer ce que tu fais sur cette ligne de code?
    $this->_FILTER->GetFilterElementName($position)
    En particulier le double déréférencement, et aussi à quoi correspond le _FILTER avec un seul 'underscore'?

    Merci
    A+
    ----
    L'avenir appartient à ceux dont les salariés se lèvent tôt.

  14. #14
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    Ha, en fait, pour bien comprendre, faut voir le but de mes classes.

    Si tu veux dans mes IHM j'ai la possibilité de faire un filtre sur une table MySQL (exemple, afficher les factures impayés). J'ai une classe abstraite de gestion des tables qui implémentent les filtres afin que les classes qui en héritent implémentent juste une fonction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function FILTER_FactureImpaye(){return "IS_PAYE=0";]
    qui correspond à une clause WHERE. Par exemple la requete final sera "SELECT * FROM Facture WHERE IS_PAYE=0;".

    Du coup je vais avoir X fonctions dans chaque classe que je stockerai dans un tableau _FILTER (il s'agit donc en gros, d'un tableau de fonctions) qui sont rangés à une position : [1]["FILTER_FactureImpaye"]. FILTER est en fait une classe qui réalise d'autres opérations mais en gros je m'en sert pour stocker d'une façon propre mes fonctions.

    Ce double référencement me permet de :

    -Récupérer le nom de la fonction à une position donné (c'est la classe abstraite qui contient ce code) $nameFonction

    - Exécuter la fonction par son nom return $this->$nameFonction();, et par exemple je viens de récupéré "IS_PAYE=0", ce qui reviens à écrire $this->FILTER_FactureImpaye().

    Dans mon cas, l'avantage est que la fonction est définie dans la classe fille et l'appel de cette fonction se fait dans la classe mère qui, ne connait pas la dite fonction. Etant donné que à chaque table MySQL est associé une classe fille, c'est vraiment pratique.

    Pour le underscore devant _FILTRE. C'est une norme que j'essaie de tenir : devant mes attributs privés et protégés je mets un underscore. Autrement dit, ça ne sert à rien, si ce n'est que si j'ai un code assez gros, je vois tout de suite quelles variables sont internes. Ha non, ça me sert aussi à autre chose de plus cool : mon éditeur gère l'autocomplétation et si je mets un '_' il m'affiche directement mes variables .

    A bientôt

    PS: C'est un peu dûr à expliquer

  15. #15
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Merci beaucoup pour ton explication.
    Même si je suis complètement inculte en Classes abstraite (je ne les ai jamais utilisées). Grace à ton explication je vais peut être essayer d'y jeter un oeil.

    Tu travail sur une application de gestion/facturation si j'ai bien compris. Est ce un produit commercial ou à usage interne?
    A+
    ----
    L'avenir appartient à ceux dont les salariés se lèvent tôt.

  16. #16
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Points : 170
    Points
    170
    Par défaut
    En fait, je dois développer un espèce de CRM qui répond à des besoins d'un métier précis (gestion de location).

    Si tu comprends l'utilité de l'héritage alors t'as compris l'intérêt des classes abstraites. Puis tu extrapoleras et tu comprendras l'utilité des interfaces.

    A bientôt

  17. #17
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    S'est amusant, je travail en relation très proche avec les syndics. J'ai mis en place un logiciel pour le suivit de la gestion technique du bâtiment au sein de notre entreprise.
    Nos activités sont convergentes finalement.
    Je bosse beaucoup avec du NFC/GPRS/Web/BDD.

    Si tu en as le temps et l'envie, nous pourrions peut être présenter nos produits mutuels, il y a peut une convergence possible ?

    A+
    ----
    L'avenir appartient à ceux dont les salariés se lèvent tôt.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 06/03/2015, 00h14
  2. [XL-2007] comment trouver une colonne dans une BD par son nom via VBA
    Par chikitin dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/06/2010, 08h52
  3. executer une fonction par son nom en string
    Par milach dans le forum C++
    Réponses: 7
    Dernier message: 11/01/2010, 17h15
  4. [PHP 5.0] instancier une classe avec son nom dans une variable
    Par Nnay_ dans le forum Langage
    Réponses: 1
    Dernier message: 12/02/2009, 12h49
  5. Récupérer objet par son nom dans une chaîne
    Par peijnoob dans le forum C#
    Réponses: 7
    Dernier message: 14/02/2008, 16h47

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