2012-12-20 5 views
7

私はLoggerオブジェクトを注入されているサービスを開発していますが、私は2種類のロガーを持つことができます。私はsyslogロガーとキューメッセージシステムロガーを持つ予定です。これは可能ですか?私は、パラメータとして配列をしていると来て、それを使用することができPHPインターフェイスで異なるパラメータでメソッドを定義することはできますか?

class Syslogger implements Loggable 
{ 
    public function log() 
    { 
     ... 
    } 
} 

class QMSLogger implements Loggable 
{ 
    public function log($queueName) 
    { 
     ... 
    } 
} 

唯一の方法:そのインターフェイスを実装

interface Loggable 
{ 
    public function log() ; 
} 

と2クラス:

アイデアは、インターフェイスをしています1つのクラスではなく、もう1つのクラスで使用しています...しかし、それは少し臭いです:P

+5

このメソッドは、あるケースではパラメータを受け取り、別のケースでは受け付けない場合、同じインターフェイスではありません。 – deceze

+0

はいこれはもっと正しい方法だと思いますが、いずれかのクラスを注入してロギングシステムを変更できるようにしたかったのですが、間違っていたと思います。 – Khriz

+2

'$ queueName'のデフォルト値がNULLの場合( 'public function log($ queueName = null){...}')しかし、私はここで欺瞞に同意します。 –

答えて

8

コメントに記載されているように、それはと同じインターフェイス。あなたが実装する場合

...はい、それはですが、:

class QMSLogger implements Loggable { 

    protected $queueName; 

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

    public function log() { 
     ... 
    } 

} 
8

あなたはそれが可能だ場合求めている:あなたはすべての可能なロガーの実装間のインターフェースを一般化することができない場合は、インスタンスコンストラクタの構成の相違部分を作りますインターフェイスは、は、その契約を尊重する必要があります。

interface Loggable 
{ 
    public function log(); 
} 

このインタフェースの契約は、あなたが任意のパラメータなしlog()を呼び出すことができです。あなたは、パラメータをオプションにすることができることを尊重するために

class QMSLogger implements Loggable 
{ 
    public function log($queueName = null) 
    { 
     ... 
    } 
} 

これはperfectly valid PHPであり、それはリスコフの置換原則を尊重します。もちろんのコーディング時にそのオプションのパラメータを使用してはいけません。そうでない場合は、明らかにインターフェイスを破棄しています。このようなパラメータは、実装を使用している場合(たとえば、QMSLoggerに密接に結合されているコードの一部)にのみ有効です。

$queueNameは設定値のようで、これはクラスのコンストラクタ(他の答えで説明したとおり)に渡す方が良いかもしれませんが、これは恐らく問題の解決策ではありません。

1

ます。また、このようにあなたは、アレイ内の任意の量で任意の値を挿入する柔軟でも片手からの契約を尊重し、配列としてパラメータを渡すことができ、これをチェックアウト:

abstract class FeaturesAbstract 
{ 
    /** 
    * @param array $paramsArray 
    * 
    * @return mixed 
    */ 
    abstract public function addExecute($paramsArray); 
} 

そして、実際にこの方法を使用するには、次のようにパラメータを送信できます。

$this->abstract->addExecute(array('paramA' => $paramA, 'paramB' => $paramB)); 

をし、その後、具体的な実装の内側にあなたが得るこのようなパラメータ:

/** 
    * @param array $paramsArray 
    * 
    * @return void 
    */ 
    public function addExecute($paramsArray) { 

    $a = $paramsArray['paramA']; 
    $b = $paramsArray['paramB']; 
    $c = ... 
} 

幸運:)

関連する問題