在不需要父项参数的情况下继承方法

时间:2014-08-31 00:23:47

标签: php class inheritance methods

我有一个这样的课程

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对象。

有什么想法吗?

1 个答案:

答案 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()