icon DIコンテナのはじめ (2019/12/30)
DIについては、DI(依存性注入) を参照 DIコンテナは、DIのインスタンス生成を、別のファイルで解決しようということです。 コンストラクターやセッターの引数(注入)が多くなると管理しきれなくなります。

DIコンテナーを利用しない例

下記のサンプルは、DogかCatを引数にして鳴き声を表示します。
class AmimalConsole {
    protected $animal;

    public function __construct(Amimal $animal) {
        $this->animal = $animal;
    }

    public function bow() {
        echo($this->animal->bow()).PHP_EOL;
    }
}

interface Amimal {
    public function bow();
}

class Dog implements Amimal {
    public function bow() {
        return 'wan! wan!';
    }
}
class Cat implements Amimal {
    public function bow() {
        return 'nya-! nya-!';
    }
}

$animal_console1 = new AmimalConsole(new Dog());
$animal_console2 = new AmimalConsole(new Cat());

$animal_console1->bow();
$animal_console2->bow();

DIコンテナを利用する

上記だと、コンストラクタの引数にクラスインスタンスを渡していますが、コンテナ(器)を引数としてみます。
bow();
$animal_console2->bow();
設計によっては、引数を複数与えたい場合があります。

pimpleでDIコンテナを作成する

下記はサンプルとしてはよくないですが、Dog、Catをそれぞれ引数にして鳴き声を表示します。 今回は、composerのContainerライブラリ「pimple」を利用しています。
$ composer require pimple/pimple ~3.0
require_once __DIR__.'/vendor/autoload.php';

use Pimple\Container;

class AmimalConsole {
    protected $dog;
    protected $cat;

    public function __construct(
        Dog $dog,
        Cat $cat
        ) {
        $this->dog = $dog;
        $this->cat = $cat;
    }

    public function bow() {
        echo($this->dog->bow()).PHP_EOL;
        echo($this->cat->bow()).PHP_EOL;
    }
}

interface Amimal {
    public function bow();
}

class Dog implements Amimal {
    public function bow() {
        return 'wan! wan!';
    }
}
class Cat implements Amimal {
    public function bow() {
        return 'nya-! nya-!';
    }
}

$container = new Container();

$container['dog'] = function() {
    return new Dog();
};

$container['cat'] = function() {
    return new Cat();
};

$container['animal'] = function ($c) {
    return new AmimalConsole($c['dog'], $c['cat']);
};

$container['animal']->bow();
このようにクラスを器に入れて(コンテナ化)、呼び出し側の実装をシンプルにできるメリットがあります。