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.

Author: Matheus, 2017-09-07

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.

 0
Author: Woss, 2017-09-08 13:32:44