Я получаю эту ошибку Strict standards: Declaration of Boo::sayHello() should be compatible with Foo::sayHello($param = false) in C:\...
Потому что я не ставлю $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'));
Это возможно полностью перезаписать или же переопределить метод в родительском классе?
Кстати, это плохой заниматься этим?
Причина ошибки в том, что количество параметров на Boo::sayHello()
не соответствует родителю Foo::sayHello()
, имея по умолчанию $param=false
на Foo::sayHello()
эта функция может быть вызвана без параметров, где в качестве функции дочернего класса Boo::sayHello()
требует параметра.
Рассмотрим следующую функцию:
function baz (Foo $f) { $f->sayHello(); }
Компилятор проверяет только правильность этого вызова функции Foo::sayHello()
как любые объекты подтипа Foo
должна иметь одинаковую сигнатуру метода для sayHello()
,
Если вы передали объект Boo
для вышеуказанной функции это не будет работать должным образом из-за разницы в сигнатурах методов / обязательных параметрах.
Вы должны иметь возможность передавать дочерние объекты класса вместо родительских объектов — переопределив родительские функции с разными сигнатурами, вы идете против этого и можете привести к ошибкам во время выполнения.
Других решений пока нет …