Это не плохая практика, если вы используете ее правильно.Позвольте мне показать пример.С этим:
interface Foo {
public function foo();
}
class Baz implements Foo {
public function foo() {
// implementation of Foo::foo()
}
public function baz() {
// specific to Baz
}
}
Следующее является плохой практикой:
function test(Foo $foo) {
$foo->foo();
$foo->baz();
}
test(new Baz);
В PHP это работает.В предварительно скомпилированных языках это не так.Это потому, что ваш аргумент $foo
имеет тип Foo
, у которого нет метода baz
.Это будет ошибка компиляции: компилятор проверяет аргумент типа Foo
, а Foo::baz
является недопустимой ссылкой.Тем не менее, они не существуют в PHP, поэтому, если вы передадите своей функции объект Baz
, это будет работать.Но это открывает дверь к странным ошибкам во время выполнения.
Правильный способ будет сделать:
function test(Baz $foo) {
$foo->foo();
$foo->baz();
}
test(new Baz);