Php 声明。。。应与……兼容完全覆盖父方法?

Php 声明。。。应与……兼容完全覆盖父方法?,php,inheritance,php-5.5,Php,Inheritance,Php 5.5,我发现这个错误严格标准:Boo::sayHello()的声明应该与C:\…中的Foo::sayHello($param=false)兼容 因为我没有在扩展子类中设置$param=false或true class Foo { var $message = 'Hello Foo'; public function sayHello($param = false) { return $this->message; } } class Boo e

我发现这个错误
严格标准:Boo::sayHello()的声明应该与C:\…
中的Foo::sayHello($param=false)兼容

因为我没有在扩展子类中设置
$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'));
是否可以完全覆盖父类中的方法或重新定义父类中的方法


顺便问一下,这样做是不是一种不良的做法?

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

考虑以下功能:

function baz (Foo $f) { $f->sayHello(); }
编译器仅根据
Foo::sayHello()
检查此函数调用的正确性,因为子类型
Foo
的任何对象都应该具有与
sayHello()
相同的方法签名

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


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

是的。您声明
Boo
Foo
,然后告诉它不是。您不能在子类中加强方法签名。