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.