PHP: Атрибут тип интерфейса
Я делаю исследование Моделей Проектов. Мой первый шаблон-это Стратегия, где у меня есть абстрактный класс, который имеет два атрибута, которые должны получить экземпляры класса, который реализует определенный интерфейс.
интерфейсы:
interface FlyBehavior
{
public function fly();
}
interface QuackBehavior
{
public function quack();
}
класс аннотация:
abstract class Duck
{
protected $flyBehavior;
protected $quackBehavior;
abstract function display();
protected function performFly()
{
return $this->flyBehavior->fly();
}
protected function performQuack()
{
return $this->quackBehavior->quack();
}
}
точки заключается в следующем: у меня есть несколько классов, которые реализуют FlyBehavior и QuackBehavior, и эти классы этого типа, которые должны быть присвоены атрибуты $flyBehavior и $quackBehavior, и я хотел бы объявить следующим образом:
abstract class Duck
{
protected FlyBehavior $flyBehavior;
protected QuackBehavior $quackBehavior;
}
Однако, если я делаю это редактор обвиняет ошибка. Как я могу сделать? Это неправильно? Потому что я знаю, что вам понятно, указать тип переменной в параметрах функции, я думаю, что также возможно атрибутов, так как в таких языках, как Java.
1 answers
Да, это неправильно. Не имеет ли смысл установить тип атрибута динамически типизированным языком. Это возможно только в статически типизированных языки, такие как Java, который был процитирован.
Что происходит, является то, что у вас есть бизнес-правила, которые должны применяться всегда, когда есть присвоение атрибута (избыточности?), то вы должны реализовать эту бизнес-правила, в метод сеттер. Учитывая, что атрибут принадлежит к классу Duck
, просто реализовать метод в этом классе:
abstract class Duck
{
protected $flyBehavior;
protected $quackBehavior;
public function setFlyBehavior(FlyBehavior $behavior) {
$this->flyBehavior = $behavior;
}
public function setQuackBehavior(QuackBehavior $behavior) {
$this->quackBehavior = $behavior;
}
}
Таким образом, как определяется тип параметра в метод, всегда есть присвоение атрибута проверяется его тип. Как такие типы интерфейсов, даже имеет смысл сделать это, и это единственный способ, - за исключением проверки типа в теле метода сеттер с помощью instaceof
.