0

我收到这个错误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'));

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

顺便说一句,这样做是不好的做法吗?

4

1 回答 1

1

错误的原因是 on 的参数数量Boo::sayHello()与 parent 不匹配Foo::sayHello(),通过默认$param=falseonFoo::sayHello()可以在没有参数的情况下调用此函数,而子类函数Boo::sayHello()需要参数。

考虑以下函数:

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

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

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

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

于 2014-11-19T08:00:58.463 回答