@gerassim

Как изменить тип параметра метода в php при наслодовании?

Допустим у нас есть два интерфейса
interface Message {
    function send();
    function setSender(Sender $sender);
}

interface Sender {
    function send(Message $message);
}


И конкретные реализации
class EmailMessage implements Message {
    private $sender;

    public function setSender(Sender $sender) {
        $this->sender = $sender;
    }
    function send() {
        $this->sender->send($this);
    }
}

class SmtpEmailMessageSender implements Sender{
    private $server;
    private $login;
    private $password;

    public function __construct($server, $login, $password) {
        $this->server = $server;
        $this->login = $login;
        $this->password = $password;
    }

    function send(Message $message) {
         ..... код отправки.....
    }
}


Как реализовать чтобы SmtpEmailSender принимал только EmailMessage для отправки, а не любой Message?
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
elevenelven
@elevenelven
Php Dev @ Amadeus
class SmtpEmailMessageSender implements Sender
{
  private $server;
  private $login;
  private $password;

  public function __construct($server, $login, $password)
  {
    $this->server   = $server;
    $this->login    = $login;
    $this->password = $password;
  }

  function send(Message $message)
  {
    if( !($message instanceof EmailMessage) ){throw new InvalidArgumentException("Instance of 'EmailMessage' expected. Got '".get_class($message)."'");}
    //...
  }
}


Это единственное решение, которое существует для вашего случая.

Другое дело, то что у вас существует некое неявное ограничение. Что вот *вдруг* интерфейс универсален, но вот в этом случае не полностью. Давайте будем принимать на вход не всех кто имплементирует наш интерфейс, а только один класс.
Это неправильно.
Делайте другой интерфейс и пусть ваш EmailMessage имплементирует его. Потому что Принцип разделения интерфейса, довольно разумный подход к написанию кода. А в частности, не может быть универсальной красивой абстракции, что вы и проиллюстрировали. (many client-specific interfaces are better than one general-purpose interface)
Переназовите ваши интерефейсы, так чтобы они соответствовали PSR.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽