ログ日記

作業ログと日記とメモ

タイプヒンティングとインターフェース

リンク元見てたら「php インターフェース タイプヒンティング」の検索が多数。
どこかで盛り上がっていたんだろうか…。


http://d.hatena.ne.jp/n314/20070128/1169999488
この辺の動きも今では何となく定まってきた。

<?php
// ビジネスロジック的なもの
interface Foo
{
    public function calc();
}

class FooImpl1 implements Foo
{
    public function calc(){ ... }
}

class FooImpl2 implements Foo
{
    public function calc(){ ... }
}

class FooOperator
{
    public function operate(Foo $foo)
    {
        $result = $foo->calc();
        ...
    }
}
<?php
// アクションクラス
class FooAction
{
    public $flag;

    public function execute(FooOperator $operator, FooImpl1 $foo1, FooImpl2 $foo2)
    {
        if ($this->flag)
            $foo = $foo1;
        else
            $foo = $foo2;

        $operator->operate($foo);
    }

}


この書き方で問題なのは、FooImpl1かFooImpl2のどちらかしか必要ではないのに両方を生成してしまっていること。
今は妥協中。


別の方法として

<?php
// アクションクラス
class FooAction
{
    public $flag;

    public function execute(FooOperator $operator)
    {
        if ($this->flag)
            $foo = LaizContainer::getInstance()->getComponent('FooImpl1');
        else
            $foo = LaizContainer::getInstance()->getComponent('FooImpl2');

        $operator->operate($foo);
    }
}

と書けば生成は片方しかされないのだが、コンテナを意識するのがちょっとめんどくさい。
$flag をコンポーネント名にすればif文は要らなくなるのだが、そのまま使うわけにはいかないので入力チェックに同じくらい手間がかかりそう。
もっといい方法の探索は保留中。