<?php

/*
 * Dependency Injection(依存性の注入)の構成
 * メールの送信手段を変更する場合、NewsletterTransfer に渡すクラスを差し替えればいい
 * 差し替えを容易にするため&命令統一のためにインターフェイスも定義する
 * これにより NewsletterTransfer が安定する
 */

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

// メール送信インターフェイス
interface MailerInterface
{
    public function 
send($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 NewsletterTransfer
{
    protected 
$mailer;

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

    public function 
send($message)
    {
        
$this->mailer->send($message);
    }
}

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

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