我有一个带有重写方法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
中覆盖它。