mardi 17 avril 2012

Héritage PHP

Je travaille actuellement avec Prestashop, et pour les besoins d'un client, je m'occupe de surcharger certaines classes et certains controllers.

Dans l'un des controllers, j'ai était confronté à un problème que je n'avais encore jamais eu: appeler une fonction dans une classe ancêtre, sans passer par le parent... Le tout, sans modifier ni le parent, ni l'ancêtre.

Un peu de mal à comprendre ? Utilisons un exemple: imaginons que l'on ait trois classes: A, B et C. Les classes A et B ne peuvent être modifiées. La classe C hérite obligatoirement de B.


class A {    
    public function fct($param) {
        $result = $param + $param;
        return $result;
    }
}

class B extends A {
    public function fct($param) {
        $result = parent::fct($param);
        return $result + $param;
    }
}

class C extends B {
    public function fct($param) {
        // Doit retourner ($param + $param) * $param; // C'est-à-dire fct($param) dans A, * $param
    }
}

Problème: appeler la fonction fct de la classe A, sans passer par la classe B.

Solution: PHP est génial! C'est prévu dans la version 5.3.2. Il faut juste mettre le nom de la classe avant d'appeler le parent.


class C extends B {
    public function fct($param) {
        $result = A::fct($param);
        return $result * $param;
    }
}

Et voilà: on bypass la classe B aussi simplement que ça !

Aucun commentaire:

Enregistrer un commentaire