[英]How to call a overrided method in child, on the parent class
我上課了
class foo {
function do_something() {
load();
}
function load() {
//things
echo 'load from foo';
}
}
還有另一個擴展foo的類(子類):
class bar extends foo {
function load() {
//things
echo 'load from bar (child)';
}
}
接着:
$obj = new bar();
我想知道的是如何調用$obj->do_something()
,以便該方法使用子級“ load”方法而不是foo類中聲明的方法。
因此,我希望輸出為:
$obj->do_something();
輸出: load from bar (child)
PHP有可能嗎?
謝謝!
您需要使用$this
限定對象上下文。 與某些其他語言不同,PHP要求您為對象內的所有方法調用使用$this
顯式限定實例。
class foo {
function do_something() {
// load();
$this->load();
}
function load() {
echo 'load from foo';
}
}
class bar extends foo {
function load() {
echo 'load from bar (child)';
}
}
$obj = new bar();
$obj->do_something();
在您的代碼中( 僅調用load()
),該語言正在尋找一個名為load
的全局定義函數,該函數當然不起作用( 或者在更壞的情況下,但會錯誤地 )
另一個答案指出,您必須通過使用self
或static
來類似地限定static方法( 我建議您繼續閱讀以了解綁定差異 )
在繼承類的覆蓋方法中,您還可以使用parent
來調用方法的父類的定義:
class bar extends foo {
function load() {
parent::load(); // right here
echo 'load from bar (child)';
}
}
這將調用父方法的load
方法版本,並繼續使用子類的定義執行。
如果您希望方法之間緊密結合,我建議您使用抽象函數。 這將需要大量維護,並且您將在類之間創建一些緊密的耦合。
我建議在父級中創建一個抽象函數,每個子級將使用其自己的邏輯來實現。
即使這樣,如果您想將父類函數更改為此
function do_something(){
if(method_exists($this, 'test')){
$this->test();
}
}
您可以使用抽象類和抽象方法:
abstract class Foo{
function test() {
$this->method();
}
abstract function method();
}
class Test extends Foo {
function method() {
echo 'class Test';
}
}
$test = new Test();
$test->test();
嘗試這個
class foo {
function do_something() {
static::load();
}
function load() {
//things
echo 'load from foo';
}
}
class bar extends foo {
function load() {
//things
echo 'load from bar (child)';
}
}
$obj = new bar;
$obj->do_something();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.