A和B具有相同簽名的功能 - 讓我們假設:foo($arg)
- 和class A extends B
。使用相同簽名/名稱調用父函數
現在我有一個實例:
$a = new A();
$a.foo($data);
可我還通過$a
運行父(B的)foo()
功能還是被它覆蓋?
謝謝! Nimi敬上
A和B具有相同簽名的功能 - 讓我們假設:foo($arg)
- 和class A extends B
。使用相同簽名/名稱調用父函數
現在我有一個實例:
$a = new A();
$a.foo($data);
可我還通過$a
運行父(B的)foo()
功能還是被它覆蓋?
謝謝! Nimi敬上
它被覆蓋,但如果你想同時使用,你可以這樣做:
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
您可以通過parent::foo()
訪問父母方法
在A類,你可以寫
parent::foo($param);
調用基類FOO(...)方法。
.
是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
可我還通過$一個運行父母的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有結果,你可能想解釋你的困境;這是一個你不應該遇到的問題,如果你這樣做,設計的可能性並不是最佳的。
'$ b'在你的例子中來自哪裏? – knittl
Ehr,好,錯字發生:)相應地編輯示例。 –
回答你的問題,不,你不能通過類A的對象調用父類的foo()方法作爲對象A在其公共API中理解的唯一的foo()方法,它自己的foo()方法。你可能需要考慮你的設計。如果B的foo()爲A的foo()提供了不同的功能,那麼是否應該覆蓋另一個?或者你需要考慮A的foo()通過parent :: foo()調用B的foo() - 假設每次調用A的foo()時都要調用B的foo()。或者使用其他模式。如果A的foo()並不總是適合A的對象,那麼您可能需要查看Decorator或Strategy patttern。
如果你開始使用面向對象編程,我不能推薦Gang of Four book足夠高。
感謝您的快速響應。這種方法很明顯,但有什麼辦法可以從外部類訪問foo()而不生成B對象嗎? – Nimi