Объявление … должно быть совместимо с … — полностью перезаписать родительский метод?

Я получаю эту ошибку 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'));

Это возможно полностью перезаписать или же переопределить метод в родительском классе?

Кстати, это плохой заниматься этим?

0

Решение

Причина ошибки в том, что количество параметров на Boo::sayHello() не соответствует родителю Foo::sayHello(), имея по умолчанию $param=false на Foo::sayHello() эта функция может быть вызвана без параметров, где в качестве функции дочернего класса Boo::sayHello() требует параметра.

Рассмотрим следующую функцию:

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

Компилятор проверяет только правильность этого вызова функции Foo::sayHello() как любые объекты подтипа Foo должна иметь одинаковую сигнатуру метода для sayHello(),

Если вы передали объект Boo для вышеуказанной функции это не будет работать должным образом из-за разницы в сигнатурах методов / обязательных параметрах.

Вы должны иметь возможность передавать дочерние объекты класса вместо родительских объектов — переопределив родительские функции с разными сигнатурами, вы идете против этого и можете привести к ошибкам во время выполнения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]