簡體   English   中英

如何在父類的子級中調用重寫的方法

[英]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的全局定義函數,該函數當然不起作用( 或者在更壞的情況下,但會錯誤地

另一個答案指出,您必須通過使用selfstatic來類似地限定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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM