Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从基类调用继承的方法_Php_Inheritance - Fatal编程技术网

Php 从基类调用继承的方法

Php 从基类调用继承的方法,php,inheritance,Php,Inheritance,我有一个具有重写方法doSomething()的扩展类。 由于某些原因,继承类的方法永远不会只运行基类 class cDemoClass { public static function getInstance() { static $instance = null; if ($instance === null) $instance = new cDemoClass(); return $instance; } private funct

我有一个具有重写方法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();
class类cdemo类{
公共静态函数getInstance(){
静态$instance=null;
如果($instance==null)
$instance=new cDemoClass();
返回$instance;
} 
私有函数_u构造(){
} 
受保护函数doSomething(){
回声“做点什么”;
}
公共函数调用{
$this->doSomething();
}
} 
类cDemoClassEx扩展了cDemoClass{
受保护函数doSomething(){
echo“做一些不同的事情”;
}
}
$baseclass=cDemoClass::getInstance();
$baseclass->call_me();
回声“
”; $extendedclass=cDemoClassEx::getInstance(); $extendedclass->call_me();
结果:

做点什么

做点什么

第二个应该是“做一些不同的事情”,至少这是我所期望的。
谁能告诉我我做错了什么?谢谢

您必须使用cDemoClassEx::getInstance()覆盖并更改此行

$instance = new cDemoClass();
进入


您还需要将
cDemoClass::\u construct()
声明为
protected
,或者只需在
cDemoClassEx
中重写它,因为
cDemoClassEx::getInstance()仍在返回新的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();
class类cdemo类{
公共静态函数getInstance(){
静态$instance=null;
如果($instance==null)
$instance=new cDemoClass();
返回$instance;
} 
私有函数_u构造(){
} 
受保护函数doSomething(){
回声“做点什么”;
}
公共函数调用{
$this->doSomething();
}
} 
类cDemoClassEx扩展了cDemoClass{
公共静态函数getInstance(){
静态$instance=null;
如果($instance==null)
$instance=new cDemoClassEx();
返回$instance;
} 
私有函数_u构造(){
} 
受保护函数doSomething(){
echo“做一些不同的事情”;
}
}
$baseclass=cDemoClass::getInstance();
$baseclass->call_me();
回声“
”; $extendedclass=cDemoClassEx::getInstance(); $extendedclass->call_me();
在这种情况下,您需要使用
后期静态绑定
(5.3+)。父方法的更改
getInstance
行:

$instance = new cDemoClass(); 

您将获得:

do something
do something differently
请在此处阅读有关此功能的更多信息:

$instance = new static();
do something
do something differently