调用继承的方法表单基类


Calling inherited method form base class

我有一个带有重写方法doSomething()的扩展类。由于某些原因,继承的类的方法永远不会只运行基类的方法。

class cDemoClass {
  public static function getInstance() {
    static $instance = null;
    if ($instance === null)
      $instance = new cDemoClass();
    return $instance;
  } 
  private function __construct() {
  } 
  protected function doSomething() {
    echo 'do something';
  }
  public function call_me() {
    $this->doSomething();
  }
} 
class cDemoClassEx extends cDemoClass {
  protected function doSomething() {
    echo 'do something differently';
  }
}
$baseclass = cDemoClass::getInstance();
$baseclass->call_me();
echo '<br/>';
$extendedclass = cDemoClassEx::getInstance();
$extendedclass->call_me();
结果:

做某事

做某事

第二个应该是"做一些不同的事情",至少这是我所期望的。谁能告诉我我哪里做错了?由于

在这种情况下,您需要使用late static binding(5.3+)。更改父方法getInstance行:

$instance = new cDemoClass(); 

$instance = new static();

你将得到:

do something
do something differently

阅读此功能的更多信息:http://www.php.net/manual/en/language.oop5.late-static-bindings.php

因为cDemoClassEx::getInstance();仍然返回new cDemoClass();。您还必须覆盖getInstance()方法:

class cDemoClass {
  public static function getInstance() {
    static $instance = null;
    if ($instance === null)
      $instance = new cDemoClass();
    return $instance;
  } 
  private function __construct() {
  } 
  protected function doSomething() {
    echo 'do something';
  }
  public function call_me() {
    $this->doSomething();
  }
} 
class cDemoClassEx extends cDemoClass {
  public static function getInstance() {
    static $instance = null;
    if ($instance === null)
      $instance = new cDemoClassEx();
    return $instance;
  } 
  private function __construct() {
  } 
  protected function doSomething() {
    echo 'do something differently';
  }
}
$baseclass = cDemoClass::getInstance();
$baseclass->call_me();
echo '<br/>';
$extendedclass = cDemoClassEx::getInstance();
$extendedclass->call_me();

您必须重写cDemoClassEx::getInstance()并更改这一行

$instance = new cDemoClass();

$instance = new cDemoClassEx();

您还需要将cDemoClass::__construct()声明为protected或简单地在cDemoClassEx中覆盖它。