76 votes

PHP: Comment appeler une fonction d'une classe enfant à partir de la classe parent

Comment appeler une fonction d'une classe enfant de la classe parent? Considère ceci:

 class whale
{
  function __construct()
  {
    // some code here
  }

  function myfunc()
  {
  // how do i call the "test" function of fish class here??
  }
}

class fish extends whale
{
  function __construct()
  {
    parent::construct();
  }

  function test()
  {
    echo "So you managed to call me !!";
  }

}
 

135voto

FlorianH Points 1722

C'est à quoi servent les classes abstraites . Une classe abstraite dit fondamentalement: Quiconque hérite de moi doit avoir cette fonction (ou ces fonctions).

 abstract class whale
{

  function __construct()
  {
    // some code here
  }

  function myfunc()
  {
    $this->test();
  }

  abstract function test();
}


class fish extends whale
{
  function __construct()
  {
    parent::__construct();
  }

  function test()
  {
    echo "So you managed to call me !!";
  }

}


$fish = new fish();
$fish->test();
$fish->myfunc();
 

36voto

Christian Engel Points 1625

D'accord, cette réponse est TRÈS tardive, mais pourquoi personne n'y a-t-il pensé?

 Class A{
    function call_child_method(){
        if(method_exists($this, 'child_method')){
            $this->child_method();
        }
    }
}
 

Et la méthode est définie dans la classe extensible:

 Class B extends A{
    function child_method(){
        echo 'I am the child method!';
    }
}
 

Donc avec le code suivant:

 $test = new B();
$test->call_child_method();
 

La sortie sera:

 I am a child method!
 

J'utilise ceci pour appeler des méthodes de hook qui peuvent être définies par une classe enfant mais ne doivent pas l'être.

18voto

Gordon Points 156415

Techniquement, vous ne pouvez pas appeler un poisson instance (enfant) à partir d'une baleine instance (parent), mais puisque vous faites affaire avec l'héritage, mafonction() sera disponible dans votre poisson instance de toute façon, de sorte que vous pouvez appeler $yourFishInstance->myFunc() directement.

Si l'on se réfère à la méthode de modèle de modèle, alors il suffit d'écrire $this->test() que le corps de la méthode. Appelant myFunc() d'un poisson instance de déléguer l'appel à test() dans le poisson instance. Mais encore une fois, pas d'appel à partir d'une baleine exemple à un poisson d'instance.

Sur une note, une baleine est un mammifère et non pas un poisson ;)

14voto

cletus Points 276888

Ok, eh bien il y a tellement de choses de mal avec cette question, je ne sais pas vraiment par où commencer.

Tout d'abord, les poissons ne sont pas les rorquals et les baleines ne sont pas des poissons. Les baleines sont des mammifères.

Deuxièmement, si vous voulez appeler une fonction dans une classe enfant d'un parent de la classe qui n'existe pas dans votre classe parent alors votre abstraction est gravement erronée, et vous devriez repenser à partir de zéro.

Troisièmement, en PHP, vous pourriez faire:

function myfunc() {
  $this->test();
}

Dans une instance de whale qu'il va provoquer une erreur. Dans une instance de fish il devrait fonctionner.

14voto

Agustin Points 18

Depuis PHP 5.3, vous pouvez utiliser le mot clé static pour appeler une méthode de la classe appelée. c'est à dire:

 <?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
?>
 

L'exemple ci-dessus affichera: B

source: PHP.net / Liaisons statiques tardives

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X