我收到此错误Strict standards: Declaration of Boo::sayHello() should be compatible with Foo::sayHello($param = false) in C:\...
因为我没有在扩展子类中设置$param = false
或true
。
class Foo
{
var $message = 'Hello Foo';
public function sayHello($param = false)
{
return $this->message;
}
}
class Boo extends Foo
{
public function sayHello($param)
{
return 'Hello Boo';
}
public function sayWorld($b)
{
return 'Hello World';
}
}
$boo = new Boo;
var_dump($boo->sayHello('a'));
var_dump($boo->sayWorld('b'));
是否可以完全覆盖或重新定义父类中的方法?
顺便说一下,这样做是糟糕的做法吗?
答案 0 :(得分:1)
错误的原因是Boo::sayHello()
上的参数数量与父Foo::sayHello()
不匹配,$param=false
上的Foo::sayHello()
默认值此功能可以在没有参数的情况下调用,因为子类函数Boo::sayHello()
需要参数。
考虑以下功能:
function baz (Foo $f) { $f->sayHello(); }
编译器仅检查此函数调用对Foo::sayHello()
的正确性,因为子类型Foo
的任何对象应具有sayHello()
的相同方法签名。
如果您将Boo
的对象传递给上述函数,由于方法签名/所需参数的不同,这将无法按预期工作。
您应该能够传递子类对象来代替父对象 - 通过重新定义具有不同签名的父函数,可能会导致运行时错误。