La méthode inatteignable
<?php
abstract class A {
private function foo() {
print __CLASS__;
}
}
abstract class B extends A {
public function foo() {
print __CLASS__;
}
}
class C extends B {
public function foo() {
print __CLASS__;
}
public function goo() {
parent::foo();
a::foo();
}
}
($c = new C)->foo();
$c->goo();
Comment appeler la méthode A::foo() ? A::foo() est publique, mais elle appartient aussi à une classe abstraite. Il est impossible de l’appeler directement, car aucun objet de ce type ne peut être créé.
C’est également le cas pour B, il faut donc appeler C. Or, entre A et C, il y a B::foo(), qui intercepte l’appel à A::foo() : elle a la priorité. Donc C::goo() peut atteindre B::foo(), mais pas A::foo().
La solution est de ne pas utiliser parent mais d’utiliser directement le nom de la classe et l’opérateur statique. Même si la méthode cible n’est pas statique, elle peut être appelée ainsi depuis une classe enfant, et la variable $this sera fournie.
Cette astuce fonctionne avec les méthodes publiques et protégées, mais pas avec les méthodes privées : c’est la visibilité qui entre en jeu.
See Also
- La méthode inatteignable [Try me]
PHP Features
Last updated: 11 October 2026