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
,然后告诉它不是。您不能在子类中加强方法签名。