DIとDIコンテナとサービスロケータ その1
DI PHP 設計
Published: 2018-02-17

本記事の範囲

本記事では、DI までを記事の範囲とします。 DI コンテナ、サービスロケータは別記事で書きます。

DI とは

依存性の注入(いそんせいのちゅうにゅう、英: Dependency injection)とは、コンポーネント間の依存関係をプログラムのソースコードから排除し、外部の設定ファイルなどで注入できるようにするソフトウェアパターンである。英語の頭文字からDIと略される。

依存性の注入の方法

注入の方法は下記のような手法がある。

  • インタフェース注入
  • setter注入
  • コンストラクタ注入

DI の例

Main.php

<?php

require_once './LoggerInterface.php';
require_once './ExampleLogger.php';
require_once './DummyLogger.php';
require_once './Application.php';

// $logger = new ExampleLogger();
$logger = new DummyLogger();
$app = new Application($logger);
$app->error('エラーが発生');

Application.php

<?php

class Application
{
    protected $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function error($message)
    {
        $this->logger->log($message);
    }
}

LoggerInterface.php

<?php
interface LoggerInterface
{
    public function log($log);
}

ExampleLogger.php

<?php

class ExampleLogger implements LoggerInterface
{
    public function log($log)
    {
        echo $log . "\n";
        return $this;
    }
}

DummyLogger.php

<?php

class DummyLogger implements LoggerInterface
{
    public function log($log)
    {
        return $this;
    }
}

DI の特徴

  1. オブジェクトの生成と使用が分離されている
  2. クライアントがサービスを呼ぶのではなく、サービスが外部からクライアントに注入される。つまり、制御が反転している

また、この例では、 - ExampleLogger、DummyLogger の実装が完了していなくても、Application の実装ができます。 - LoggerInterface を実装した新しいクラスに切り替えるとき、呼び出し元の変更だけでokです。

参考