我有这段代码:
abstract class Base{
public function delete(){
// Something like this (id is setted in constructor)
$this->db->delete($this->id);
}
}
然后我有另一个扩展Base的类,例如:
class Subtitles extends Base{
public function delete($parameter){
parent::delete();
// Do some more deleting in transaction using $parameter
}
}
也恰好有方法删除。
问题出现了:
当我打电话
$subtitles->delete($parameter)
我得到了:
Strict error - Declaration of Subtitles::delete() should be compatible with Base::delete()
所以我的问题是,为什么我不能使用不同参数的后代方法?
感谢您的解释。
答案 0 :(得分:5)
这是因为PHP的方法覆盖而不是方法重载。因此方法签名必须完全匹配。
作为您的问题的工作,您可以将基类的重构重组为
public function delete($id = null){
// Something like this (id is setted in constructor)
if ($id === null) $id = $this->id;
$this->db->delete($id);
}
然后更改您的子类方法签名以匹配。
答案 1 :(得分:3)
要覆盖基类中的函数,方法必须与它所替换的方法具有相同的“签名”。
签名由名称,参数(和参数顺序)和返回类型组成。
这是多态的本质,也是面向对象编程获得大部分功能的地方。如果您不需要覆盖父方法,请为新方法指定一个不同的名称。
答案 2 :(得分:1)
这可以作为对@ orangePill's ansert的评论,但我的声誉不足以发表评论。
我在使用静态方法时遇到了同样的问题,我使用late static binding执行了以下操作。也许这有助于某人。
abstract class baseClass {
//protected since it makes no sense to call baseClass::method
protected static function method($parameter1) {
$parameter2 = static::getParameter2();
return $parameter1.' '.$parameter2;
}
}
class myFirstClass extends baseClass {
//static value, could be a constant
private static $parameter2 = 'some value';
public static function getParameter2() {
return self::$parameter2;
}
public static function method($parameter1) {
return parent::method($parameter1);
}
}
class mySecondClass extends baseClass {
private static $parameter2 = 'some other value';
public static function getParameter2() {
return self::$parameter2;
}
public static function method($parameter1) {
return parent::method($parameter1);
}
}
用法
echo myFirstClass::method('This uses'); // 'This uses some value'
echo mySecondClass::method('And this uses'); // 'And this uses some other value'