<?php

/*
 * 注入すべきものが増えた構成
 * 注入するものをさらに増やしたり変更したりする場合、修正箇所が多くなる
 */

/**************************************************/

// メール送信インターフェイス
interface MailerInterface
{
    public function 
send($body);
}

// ログ記録インターフェイス
interface LoggerInterface
{
    public function 
record($body);
}

/**************************************************/

// Sendmailでメール送信
class SendmailMailer implements MailerInterface
{
    public function 
send($body)
    {
        echo 
'Sendmailで送信しました:' $body "\n";
    }
}

// SMTPでメール送信
class SmtpMailer implements MailerInterface
{
    public function 
send($body)
    {
        echo 
'SMTPで送信しました:' $body "\n";
    }
}

/**************************************************/

// ファイルでログ記録
class FileLogger implements LoggerInterface
{
    public function 
record($body)
    {
        echo 
'Fileで記録しました:' $body "\n";
    }
}

// データベースでログ記録
class DatabaseLogger implements LoggerInterface
{
    public function 
record($body)
    {
        echo 
'Databaseで記録しました:' $body "\n";
    }
}

/**************************************************/

// ニュースレター送信
class NewsletterTransfer
{
    protected 
$mailer$logger;

    public function 
__construct(MailerInterface $mailerLoggerInterface $logger)
    {
        
$this->mailer $mailer;
        
$this->logger $logger;
    }

    public function 
send($message)
    {
        
$this->mailer->send($message);
        
$this->logger->record(date('Y-m-d H:i:s') . ':送信完了');
    }
}

/**************************************************/

// 送信処理
$newsletter = new NewsletterTransfer(new SendmailMailer(), new FileLogger());
$newsletter->send('今月のピックアップニュース');

/**************************************************/