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 :

Appeler une fonction externe à une classe avec une variable de fonction [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut Appeler une fonction externe à une classe avec une variable de fonction
    Bonjour à tous (enfin, bonsoir),

    Je suis en train d'apprendre la POO avec php. En ce moment, je m'amuse à créer une classe permettant de poster des commentaires sur un site. J'essaye de la faire interagir avec cryptographp, le script bien connu de génération de captcha. J'ai fini par réussir, mais un peu par hasard ; je ne suis pas sûr d'avoir compris comment.

    Je m'explique: Au début, je cherchais à définir la fonction dans les attributs (pour le cas où l'on veuillent utiliser un autre système de captcha). Je faisais donc un truc du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public $captcha = 'dsp_crypt'; //fonction affichant le captcha
    puis dans la méthode d'affichage du formulaire, je faisais naïvement
    ce qui me donnait un magnifique :
    Call to undefined method comment::captcha()
    Quelle naïveté... Bref, après avoir cherché des infos sans succès sur le sujet, j'ai décidé de laisser tomber la variable de fonction et de directement placer dans la méthode le code :
    Là ça marche super! Je décide donc de laver mon code, et je supprime de mes paramètres la variable de fonction qui ne sert plus à rien (public $captcha = 'dsp_crypt'; ) Et là? Surprise, ça ne marche plus ! Si je la remet en paramètre, ça remarche...

    Je ne comprends absolument pas ce comportement. J'imagine que je ne m'y prends pas de la bonne façon. Pourriez-vous s'il vous plaît éclairer ma petite personne sur ce grand mystère ?

    Pour reformuler la question: Comment fait-on pour appeler une fonction externe à une classe depuis l'une de ses méthodes?

    Merki !

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    heuuu ton problème est bizarre effectivement... et d'après les petits bouts de code que tu nous donnes, difficile de te répondre efficacement... crée une réponse et joint ton/tes fichier(s)

    je peux par contre t'éclairer sur un point : appeler dynamiquement une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $this->{$captcha}(0,1); // méthode (donc fonction d'une classe)
    ${$captcha}(0,1); // simple fonction
    $$captcha(0,1); // simple fonction, 2ieme écriture possible
    voili voilou

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Je me disais bien aussi que c'était bizarre

    Bon en fichier joint la classe problématique qui fonctionne: comment.class.php. Les lignes incriminées sont les lignes 47
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public $captcha = 'dsp_crypt';
    et 125
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($this->captcha)) {echo '<span id="captchouille">'; dsp_crypt(0,1); echo '</span><input type="text" name="captcha" id="captcha" tabindex="500" size="20" /><em>(recopiez le code)</em><br />';}
    Si je supprime la ligne 47, le captcha ne s'affiche plus. Voilou.

    Merci beaucoup pour ton attention !


    (PS: j'ai aussi joint le second fichier, qui correspond à la page de redirection)

    ----- EDIT -----

    J'oubliais, j'appelle les méthodes comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php include('./cont/commentaires/comment.class.php');
    				$comment_cont_{$_GET['id']} = new comment($_GET['id']); 
    				$comment_cont_{$_GET['id']}->form_comment();			
    				$comment_cont_{$_GET['id']}->count_comment();
    				$comment_cont_{$_GET['id']}->disp_comment(); ?>
    Fichiers attachés Fichiers attachés

  4. #4
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    En fait, l'erreur n'est pas ce que tu crois qu'elle est

    l'erreur affichée vient de car il est vrai que la fonction n'existe nul part (aucun include et aucune définition de la fonction)

    donc quand tu écris "$this->captcha" la condition est vraie et donc il t'affiche l'erreur...

    et forcément quand tu le met la ligne en commentaire, la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($this->captcha))
    est fausse donc pas de soucis....

    Si tu as du mal à comprendre, écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (isset($this->captcha)) {echo '<span id="captchouille">'; dsp_crypt(0,1); echo '</span><input type="text" name="captcha" id="captcha" tabindex="500" size="20" /><em>(recopiez le code)</em><br />';}
    				else {
    					echo "pas de captcha";
    				}
    Et fais quelques tests, tu comprendras mieux

    voici d'ailleurs une écriture plus correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (function_exists($this->captcha)) {echo '<span id="captchouille">'; $this->captcha(0,1); echo '</span><input type="text" name="captcha" id="captcha" tabindex="500" size="20" /><em>(recopiez le code)</em><br />';}
    				else {
    					echo "Erreur : la fonction n'existe pas !";
    				}

    tant que j'y suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public $verif_captcha = 'chk_crypt($post_captcha]))'; //fonction vérifiant le captcha. Peut êtrevide.
    c'est pas très bien... tu peux attribuer le nom d'une fonction a une variable mais il ne me semble pas que tu puisses lui donner les paramètres en plus !!!
    PS : y'a un crochet perdu dedans en plus
    ==>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public $verif_captcha = 'chk_crypt'; //fonction vérifiant le captcha.
    ${$verif_captcha}($post_captcha))'; // Peut êtrevide.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    ok, je te remercie beaucoup pour ta réponse

    je regarde tout ça en détail et je te fais un retour.

    merci encore! ce n'est vraiment pas évident d'apprendre la POO tout seul, heureusement qu'il y des gens sympas comme toi pour filer un coup de main!


  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    bon, ok, le problème sur la variable venait de ce que j'avais oublié de retirer mon conditionnel...

    Bon, on peut donc revenir à la partie intéressante de la question: comment faire appel à une fonction externe?

    La méthode form_comment() est appelé depuis une page où est inclus la fonction dsc_crypt() (en fait, depuis l'index), mais cela ne marche pas( Call to undefined method comment::captcha() ). Dois-je en conclure que je suis supposé inclure cette fonction quelque part dans la classe?

    J'ai vaguement l'impression que cela a un rapport avec la notion d' 'héritage'... Mais en même temps dsc_crypt() est une fonction dans un script, pas une méthode d'une classe.

  7. #7
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    hmmm il vaudrait mieux la redéfinir dans ta classe histoire de l'appellée directement dedans...

    Ou alors d'inclure le fichier dans ta méthode, mais ça fait moins propre je trouve :s

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Ok, désolé de polluer avec tous ces posts.

    Bon, après différents tests si j'utilise directement la fonction dsp_crypt(0,1); dans la méthode, ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (function_exists($this->captcha)) {echo '<span id="captchouille">'; dsp_crypt(0,1); echo '</span><input type="text" name="captcha" id="captcha" tabindex="500" size="20" /><em>(recopiez le code)</em><br />';}
    Par contre si j'utilise la variable de fonction $this->captcha(0,1); :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (function_exists($this->captcha)) {echo '<span id="captchouille">'; $this->captcha(0,1); echo '</span><input type="text" name="captcha" id="captcha" tabindex="500" size="20" /><em>(recopiez le code)</em><br />';}
    J'obtiens bien le message :

    Call to undefined method comment::captcha()
    Donc j'en conclue:
    1. Il n'est pas nécessaire d'inclure dans une classe une fonction appelée dans une de ses méthode si cette fonction est incluse dans le script où est appelée la méthode. Vrai?

    2. Mon problème doit provenir d'une mauvaise compréhension des variables de fonctions et de leur comportement dans une classe...

    Donc je peux maintenant formuler la vraie question:

    Comment définir convenablement une variable de fonction dans les paramètres d'une classe ( public $var = 'fonction' ????) et comment appelé cette fonction depuis une des méthodes ( puisque $this->var() ne marche pas avec la définition précédente ) ?

    (fff, on avance l'air de rien...)

  9. #9
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    vala, si j'ai oublié un exemple ou que tu as besoin d'explications, dis-le mwa

    Code php : 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?php
    /**** LA CLASS ****/
    class myClass {
       var $myFunctionName = "fctShowStr";
       var $myMethodName = "mtdShowStr";
     
       function __myClass() {
    		$this->myMethodName = $myMethodName;
    		$this->myFunctionName = $myFunctionName;
       }
     
       function myMethod($var) {
             $this->{$var}("appel \"interne\"");
       }
     
       function mtdShowStr($str) {
             echo "methode : ".$str."<br />";
       }
     
       function useFonction($var) {
    	fctShowStr($var);
       }
     
       function toutInterne() {
    		$this->{$this->myMethodName}("tout depuis l'intérieur, waouw !!!");
    		$myFCT = $this->myFunctionName;
    		$myFCT("tout depuis l'intérieur mais avec la fonction cette fwa ! waouw !!!");
       }
    }
     
    /**** LA FONCTION ****/
    function fctShowStr($str) {
    	echo "fonction : ".$str."<br />";
    }
     
    /***** TESTS *****/
    $maFonction = "fctShowStr";
    $maMethode = "mtdShowStr";
     
    $test = new myClass();
    # méthode
    $test->{$maMethode}("appel direct de la methode");
    $test->myMethod($maMethode);
    $test->toutInterne();
    # fonction
    $test->useFonction("appel de la fonction");
    $maFonction('appel direct hors de la classe');
    # RESULTATS 
    /*
    			methode : appel direct de la methode
    			methode : appel "interne"
    			methode : tout depuis l'intérieur, waouw !!!
    			fonction : tout depuis l'intérieur mais avec la fonction cette fwa ! waouw !!!
    			fonction : appel de la fonction
    			fonction : appel direct hors de la classe
    */
    ?>

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 58
    Points
    58
    Par défaut
    Génial !! ça marche, merci beaucoup !

    Bon pour synthétiser un peu tout ça ( y en a besoin ) , le cas qui me concernait était simplement :

    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
    <?php
    /**** LA CLASS ****/
    class myClass 
    {
    var $myFunctionName = "fonction"; // La fonction est en dehors de la classe, incluse dans la page où on fait appel à la méthode. 
    
    function toutInterne() 
    {
    		$myFCT = $this->myFunctionName; // C ça qui me manquait !!
    		$myFCT("tout depuis l'intérieur mais avec la fonction cette fwa ! waouw !!!");
     }
    }
    
    /***** TESTS *****/
    $test = new myClass();
    $test->toutInterne();
    Par contre, je n'ai pas eu besoin de faire:

    function __myClass() {
    $this->myMethodName = $myMethodName;
    $this->myFunctionName = $myFunctionName;
    }
    Voilou. Donc dit en bon français :

    Pour faire appel à des fonctions externes à une classe donnée depuis une de ses méthodes à l'aide d'une variable de fonction, il faut:

    1. Dans les paramètres de la classe définir une variable contenant le nom de la fonction ($var='fonction')
    2. Dans la méthode, récupérer le nom de cette fonction dans une nouvelle variable qui devient ainsi une véritable variable de fonction ($VarFonc = $this->var)
    3. Enfin, toujours dans la méthode, appeler la fonction avec la variable de fonction ($VarFonc(param)).

    Ces le point 2. qui pose des problèmes philosophiques intéressant. Pourquoi '$this->var' n'est pas directement une variable de fonction? Cela m'échappe un peu.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/07/2014, 18h41
  2. Appeler une classe avec une autre classe
    Par zooffy dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 27/01/2010, 15h15
  3. [Smarty] Attribuer une class en fonction d'un résultat avec une variable
    Par kitten13 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 25/09/2008, 20h03
  4. Réponses: 4
    Dernier message: 23/10/2006, 09h09
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

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