我正在尝试实现两次接口扩展另一个接口,但无法弄清楚为什么我会收到致命错误
这是我的代码:
interface a {
public function foo();
}
interface b extends a {
public function baz(Baz $baz);
}
// This will work
class c implements b {
public function foo() {
}
public function baz(Baz $baz) {
}
}
// This will not work and result in a fatal error
class d implements b {
public function foo() {
}
public function baz(Foo $foo) {
}
}
我收到此错误消息:
致命错误:d :: baz()的声明必须与第26行的K:\ xampp \ htdocs \ oop \ Lec 2 \ index.php中的b :: baz(Baz $ baz)兼容< /强>
答案 0 :(得分:6)
您的班级d错误地实施了baz
方法。接口指定它必须使用typehint Baz
接受参数,但是您使用typehint Foo
- 不允许从接口更改参数类型。 D类中的修复将是:
<?php
class d implements b
{
public function foo() {}
public function baz(Baz $foo) {}
}
函数的args由接口指定,可能不会改变。
答案 1 :(得分:1)
这不是Java,你不能(不幸的是)重载方法。所以,最后有类似
的东西class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
public function baz(Baz $baz)
{
}
}
将导致
致命错误:无法在行 XX < [...] 中重新声明d :: baz() / p>
实现界面时,必须以与声明相同的方式实现它。因此,由于baz
使用Baz $baz
参数声明,因此必须使用相同的参数实现它。
class d implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}