我有一个这样的课程
class Parent {
public function add($query = "", $queryParams = []) {
if(empty($query)) {
$query = "blablabla";
}
if(empty($params)) {
$params = [blablabla];
}
//... some logic;
//return something;
}
}
我希望有一个像这样的Child类
class Child extends Parent {
public function add() {
$query = "blablabla";
$params = [blablabla];
return parent::add($query, $params);
}
}
但它总是抛出一个错误,说子类方法必须'兼容',这意味着我必须声明相同的参数。
我在想像父母那样声明一个函数:
public function __add($query = "", $params = []) {}
并在子类中声明如下函数:
public function add() {
$query = "blabla"; $params = [blabla];
return parent::__add($query, $params);
}
一个问题是我仍然需要使用一些Parent类对象和方法add(),我并不总是只使用Inherited classes对象。
有什么想法吗?
答案 0 :(得分:1)
虽然你可以忽略" strict"消息,这个是给出一个原因:改变父方法的签名是一件坏事,因为它违反了着名的"Liskov Substitution Principle":一个Child类应该总是能够替换它的Parent。例如,如果您有类似
的内容$p = new Parent();
$p->do_this()
$p->and_that()
$p->add(x,y)
如果用
替换第一行$p = new Child();
其余代码应该像以前一样工作。显然,更改签名会导致签名中断。
在Child中创建一个新方法,例如addWithDefaults()
或类似的,并保留继承的add()
。