2010-10-25 6 views
0
<?php 
class a { 
    public function foo() { 
     echo __METHOD__ . PHP_EOL; 
    } 
} 
class b extends a { 
    public function foo() { 
     $this->foo(); # I want to call a's foo method here. 
     echo __METHOD__ . PHP_EOL; 
    } 
} 
class c extends a { 
    public function foo() { 
     echo __METHOD__ . PHP_EOL; 
     $this->foo(); # I want to call a's foo method here. 
    } 
} 
class d extends a { 
    # This class does not handle anything super special in our foo step, so I don't over write a's foo(); 
} 
$a = new a; $a->foo(); 
$b = new b; $b->foo(); 
$c = new c; $c->foo(); 
$d = new d; $d->foo(); 
?> 

Je suis sûr qu'il y en a plusieurs qui se grattent la tête en essayant de comprendre pourquoi je voudrais faire quelque chose comme ça, alors Je vous promets que cela aura du sens, laissez-moi vous expliquer. J'ai une fonction qui fonctionne très bien par moi-même et j'ai d'autres classes qui s'étendent sur la classe de base pour y ajouter des fonctions, ces classes font la même tâche mais dans un contexte différent ou avec des informations supplémentaires. ils doivent faire toutes les étapes de la classe parente, mais ils doivent aussi faire des sous-ensembles spéciaux dans certains cas.Appel de la première déclaration de foo d'une classe étendue qui déclare son propre foo

Y a-t-il un moyen de toujours exécuter la méthode foo et la méthode foo de mes sous-classes? Je sais que je pourrais résoudre ce problème avec d'horribles hacks comme faire de la méthode un fichier, et ensuite inclure ce fichier dans la fonction parent et ses frères et sœurs si nécessaire, ou je pourrais faire une seconde méthode appelée bar() qui serait contiennent les instructions de foo() et ont mes sous-classes écrasent foo() mais appellent bar() quand ils ont besoin de la fonctionnalité de foo(). Je me demande simplement si je peux le faire sans utiliser des hacks assez intéressants, y a-t-il quelque chose que je ne sais pas sur PHP que quelqu'un ici puisse m'apprendre?

Répondre

3

Vous pouvez essayer parent :: foo();

dans la classe c:

public function bar(){ 
    return parent::foo(); 
} 

Voir Example 3 in the PHP Manual on Scope Resolution

+0

Ok, je suis sûr que j'ai essayé et PHP feuilletais une merde, mais je vais lui donner un autre coup sûr. Merci! –

+0

Eh bien cela a fonctionné cette fois, donc je dois faire quelque chose de mal la première fois. –

Questions connexes