Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

PHP Features

Last updated: 11 October 2026