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 :

Appel de fonction !


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut Appel de fonction !
    voila mon probleme :
    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
    class A
    {
        function f1() {$this->f2();}
       function f2() {echo 'A::f2';}
     
    }
     
    class B extends A
    {
        function f2() {echo 'B::f2';}
        function f1()
      {
          parent::f1();
      }
    }
     
    $instanceB = new B();
    $instanceB->f1(); ## j aimerai voir s afficher A::f2 !!!!
    Dans le code ci dessus, comment etre sur que la fonction f1 de la class A appelle TOUJOURS la fonction f2 de cette meme classe A ??
    (php 4!!)

  2. #2
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Je suis pas réveillé ou la question ne correspond pas à l'exemple

    Il y a peut-être un souci de modélisation...

  3. #3
    Membre Expert
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Par défaut
    Non la question est claire (quoiqu'un peu tordue de bon matin)

    Il me semble que j'avais lu quelque part que quand des fonctions portaient le même noms dans des classes parents/héritées, celle appelée en premier était toujours celle de la classe appelante (dans ton cas $this->f2() appelé dans A doit être toujours celle de A)

    Ceci dit après ya les notions de classes abstraites qui entrent en jeu mais bon ça ne concerne pas ton exemple !
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  4. #4
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    que la fonction f1 de la class A
    Mais l'exemple c'est avec une instance de B

  5. #5
    Membre Expert
    Avatar de guitou12
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 077
    Par défaut
    Citation Envoyé par JWhite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    que la fonction f1 de la class A
    Mais l'exemple c'est avec une instance de B

    F1 de B appelle F1 de A qui appelle F2 de A (ou devrait l'appeler en tout cas )
    Ex développeur Php / J2EE.
    Actuellement reconverti à SharePoint 2013

    Mon blog SP 2013

  6. #6
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Ah oki je viens de comprendre le problème.

    En fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function f1()
      {
          parent::f1();
      }
    ça sert à rien (c'est le principe même de l'héritage).

    Ce problème a un nom mais je n'en ai plus souvenir malheureusement... Il faudrait que je fouille dans mes cours

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 774
    Par défaut
    en fait je crois que tu dois plutot faire confiance au mécanisme de la POO.
    ça n'affiche pas ce que tu veux?
    Au fait ce que je comprend pas c'est pourquoi tu redefini la fonction f1 dans la classe B alors que ça fait rien d'exceptionnel.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    hello,

    peut-etre comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class A
    {
        function f1() {self::f2();}
       function f2() {echo 'A::f2';}
     
    }
    c'est sans garanties mais a priori...

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    Oui, tout à fait, la dernière solution est bonne. En php comme en javascript (si vous faites de la POO en javascript) this pointe sur l'objet en cours, et on regarde les méthodes de l'objet utilisé. Le compilateur ne regarde pas "Où est-ce qu'on est" mais "quelles méthodes possède l'objet manipulé". Et très important encore, les méthodes ne dépendent pas forcément de la définition de la classe. Vous pouvez supprimer et rajouter des méthodes sur un objet, de telle sorte qu'il n'ait de la class plus que le nom. Une autre manière de voir les choses et pour empêcher les adeptes de la programmation objet de faire des cauchemards est que toutes les méthodes sont virtuelles en PHP. Les tests sont rapides, en modifiant le code au dessus :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
     
    class A
    {
      function f1()
      {
        echo "A::f1\n";
        $this->f2();
        self::f2();
      }
     
      function f2()
      {
        echo "A::f2\n";
      }
    }
     
    class B extends A
    {
      function f1()
      {
        echo "B::f1\n";
        parent::f1();
      }
     
      function f2()
      {
        echo "B::f2\n";
      }
    }
     
    $instanceB = new B();
    $instanceB->f1();
     
     
    ?>
    La sortie est bien ce que l'on attends :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B::f1
    A::f1
    B::f2
    A::f2

    [edit]J'comprends pas que certains parlent de modélisations sur quelque chose qui n'en représente aucune, mais seulement qui sert à comprendre le mécanisme.[/edit]

  10. #10
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    J'comprends pas que certains parlent de modélisations sur quelque chose qui n'en représente aucune, mais seulement qui sert à comprendre le mécanisme.
    Ca donne un peu une impression de bidouille (si la POO est bien utilisée on doit pourvoir éviter ça), si c'est juste pour s'amuser et voir comment ça marche ok mais si il fait un topic pour ça c'est qu'il doit y avoir un intérêt d'exploitation derrière

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    Il est vrai qu'en principe, si une fonction est virtuelle, on ne cherchera généralement pas à appeller la fonction de la classe de base. Mais en fait, ça ne me choquerait pas plus que ça, pas plus que d'être obligé de penser autrement pour parer à une faiblesse de la syntaxe.

Discussions similaires

  1. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  2. Réponses: 4
    Dernier message: 19/04/2004, 13h41
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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