Labs

<< 最初 < 前ページ 次ページ > 最後 >>
icon Composer インストール (2020/01/12)

Composer 公式のインストール


$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === 'baf1608c33254d00611ac1705c1d9958c817a1a33bce370c0595974b342601bd80b92a3f46067da89e3b06bff421f182') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
$ sudo mv composer.phar /usr/local/bin/composer


getcomposer.org のPHPインストーラを利用する


ComposerインストールようのPHPファイル https://getcomposer.org/installer を利用して /usr/local/bin/ にcomposer をインストール
$ curl -s https://getcomposer.org/installer | php && sudo mv -v composer.phar /usr/local/bin/composer


Composer バージョン確認


$ composer --version
Composer version 1.9.1 2019-11-01 17:20:17


Composer アップデート


$ composer self-update
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コンテナを利用する


上記だと、コンストラクタの引数にクラスインスタンスを渡していますが、コンテナ(器)を引数としてみます。

//Animal Class 同様のため省略

$container = [];

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

$animal_console1 = new AmimalConsole($container['animal']());
$animal_console2 = new AmimalConsole($container['animal']());
$animal_console1->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();

このようにクラスを器に入れて(コンテナ化)、呼び出し側の実装をシンプルにできるメリットがあります。
icon DI(依存性注入) (2019/12/30)

DIとは


DI(Dependency injection) は依存性の注入の意味です。
ここで言う「依存性」は、オブジェクト思考でいうと大まかに「クラスファイル」と考えて良いかと。
そしてそのクラスが特定の定数、変数、インスタンスに依存しまい、単体テストに支障がでている状態です。

class Dog {
public function isBow() {
$person = new Person();
return ($person->action() == 'walk');
}
}
class TestDog {
public function testBow() {
$dog = new Dog();
$this->assertTrue($dog->isBow());
}
}



上記だと、Dogクラス内にPersonクラスに依存してしまってます。
「$person->action() == 'walk'」の実装が変わってしまうと、assertTrue() した結果は、Personクラスが変更があった場合に変わってしまいます。

解決方法としては、Dogクラスの動作させるメソッドでインスタンスを作成せずに、コンストラクタやセッターに、Personを入れて(注入)して解決します。
class Dog {
protected $person;

public function __construct(Person $person) {
$this->person = $person;
}

public function isBow() {
return ($this->person->action() == 'walk');
}
}
class TestDog {
public function testBow() {
$person = new Person();
$person->expects($this->any())
->method('action')
->will($this->returnValue('walk'));
$dog = new Dog($person);
$this->assertTrue($dog->isBow());
}
}
<< 最初 < 前ページ 次ページ > 最後 >>