2011-11-16 57 views
2

A和B具有相同簽名的功能 - 讓我們假設:foo($arg) - 和class A extends B使用相同簽名/名稱調用父函數

現在我有一個實例:

$a = new A(); 

$a.foo($data); 

可我還通過$a運行父(B的)foo()功能還是被它覆蓋?

謝謝! Nimi敬上

回答

4

它被覆蓋,但如果你想同時使用,你可以這樣做:

function parentFoo($arg) 
{ 
    return parent::foo($arg); 
} 

如果你想要孩子函數調用父功能做到這一點:

function foo($arg) 
{ 
    $result = parent::foo($arg); 
    // Do whatever you want 
} 

見此網址獲取更多信息:http://php.net/manual/en/keyword.parent.php

+0

感謝您的快速響應。這種方法很明顯,但有什麼辦法可以從外部類訪問foo()而不生成B對象嗎? – Nimi

0

您可以通過parent::foo()訪問父母方法

0

在A類,你可以寫

parent::foo($param); 

調用基類FOO(...)方法。

5

.是PHP中的字符串連接運算符。要調用方法,請使用->

要調用一個重寫的方法,使用parent::method()

class B { 
    public function foo($data) { 
    echo 'B'; 
    } 
} 

class A extends B{ 
    public function foo($data) { 
    parent::foo($data); 
    echo 'A'; 
    } 
} 

$a = new A(); 
$a->foo($data); // BA 
$b = new B(); 
$b->foo($data); // B 
0

可我還通過$一個運行父母的FOO()函數或者是重寫?

不是來自「外部」。你說:

<?php 
class A { 
    function talk() { 
     return 'Hello world'; 
    } 
} 
class B extends A { 
    function talk() { 
     return 'Goodbye world'; 
    } 
} 

$b = new B; 
$b->talk(); // Goodbye world. 

在這個例子中,它不可能有$ B->通話輸出A ::通話(),比進行代理,通過B.其他如果您需要從的,而不是B有結果,你可能想解釋你的困境;這是一個你不應該遇到的問題,如果你這樣做,設計的可能性並不是最佳的。

+0

'$ b'在你的例子中來自哪裏? – knittl

+0

Ehr,好,錯字發生:)相應地編輯示例。 –

1

回答你的問題,不,你不能通過類A的對象調用父類的foo()方法作爲對象A在其公共API中理解的唯一的foo()方法,它自己的foo()方法。你可能需要考慮你的設計。如果B的foo()爲A的foo()提供了不同的功能,那麼是否應該覆蓋另一個?或者你需要考慮A的foo()通過parent :: foo()調用B的foo() - 假設每次調用A的foo()時都要調用B的foo()。或者使用其他模式。如果A的foo()並不總是適合A的對象,那麼您可能需要查看DecoratorStrategy patttern。

如果你開始使用面向對象編程,我不能推薦Gang of Four book足夠高。

相關問題