声明...应该与...兼容 - 完全覆盖父方法?

时间:2014-11-19 07:43:18

标签: php inheritance php-5.5

我收到此错误Strict standards: Declaration of Boo::sayHello() should be compatible with Foo::sayHello($param = false) in C:\...

因为我没有在扩展子类中设置$param = falsetrue

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'));

是否可以完全覆盖重新定义父类中的方法?

顺便说一下,这样做是糟糕的做法吗?

1 个答案:

答案 0 :(得分:1)

错误的原因是Boo::sayHello()上的参数数量与父Foo::sayHello()不匹配,$param=false上的Foo::sayHello()默认值此功能可以在没有参数的情况下调用,因为子类函数Boo::sayHello()需要参数。

考虑以下功能:

function baz (Foo $f) { $f->sayHello(); }

编译器仅检查此函数调用对Foo::sayHello()的正确性,因为子类型Foo的任何对象应具有sayHello()的相同方法签名。

如果您将Boo的对象传递给上述函数,由于方法签名/所需参数的不同,这将无法按预期工作。

您应该能够传递子类对象来代替父对象 - 通过重新定义具有不同签名的父函数,可能会导致运行时错误。