2010-10-25 60 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(); 
?> 

我敢肯定你們中有些人撓頭試圖弄清楚爲什麼我會想要做這樣的事情,所以我向你保證這會有道理,讓我解釋一下。從擴展類中調用foo的第一個聲明,聲明它自己的foo

我有一個函數可以正常工作,它有自己的功能,我還有一些其他的類可以擴展到基類上,爲它添加一些函數,這些類在不同的上下文中執行相同的任務,他們必須完成父類的所有步驟,但他們在某些情況下也必須執行一些特殊的子集。

有沒有辦法我仍然可以執行a的foo方法和我的子類foo方法?

我知道我可以用一些可怕的黑客來解決這個問題,比如將該方法制作爲一個文件,然後將該文件包含在父函數和它的兄弟文件中,或者我可以創建第二個方法bar()包含foo()的指令,並讓我的子類覆蓋foo(),但在需要foo()的功能時調用bar()。我只是想知道如果我可以做到這一點,而不使用一些非常有趣的黑客,有什麼我不知道的PHP有人在這裏可以教我?

回答

3

你可以嘗試parent :: foo();

在C類

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

Example 3 in the PHP Manual on Scope Resolution

+0

好吧,我敢肯定,我想,和PHP擲狗屎,但我給它一個鏡頭是肯定的。謝謝! – 2010-10-25 09:26:52

+0

這次它有效,所以我必須第一次做錯了。 – 2010-10-25 09:51:50