Dans l'exemple de code ci-dessous, la méthode test()
dans la classe parent Foo
est remplacée par la méthode test()
dans la classe enfant Bar
. Est-il possible d'appeler Foo::test()
à partir de Bar::test()
?
class Foo
{
$text = "world\n";
protected function test() {
echo $this->text;
}
}// class Foo
class Bar extends Foo
{
public function test() {
echo "Hello, ";
// Cannot use 'parent::test()' because, in this case,
// Foo::test() requires object data from $this
parent::test();
}
}// class Bar extends Foo
$x = new Bar;
$x->test();
parent::test();
(voir l'exemple 3 à http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php
L'appel d'une méthode parent peut être considéré comme une mauvaise pratique ou une odeur de code et peut indiquer une logique de programmation pouvant être améliorée de manière à ce que l'enfant ne soit pas obligé d'appeler le parent. Une bonne description générique est fournie par Wikipedia .
Une implémentation sans appel du parent ressemblerait à ceci:
abstract class Foo
{
$text = "world\n";
public function test() {
$this->test_child();
echo $this->text;
}
abstract protected function test_child();
}// class Foo
class Bar extends Foo
{
protected function test_child() {
echo "Hello, ";
}
}// class Bar extends Foo
$x = new Bar;
$x->test();