2017-05-18 14 views
1

私は自分のサービスクラス用の汎用インターフェイスを作成しようとしています。私はインターフェイスを使用する2つのクラスに問題があります。それらはcreateというメソッドを共有します。 createメソッドは、3つのパラメータを除いています。私は、3つ目のパラメータをオプションにして、両方のクラスがそれに対応できるようにしたいと思います。PHPインターフェイスのオプションパラメータ

interface ServiceInterface{ 

    public static function create($var1, $var2, $thisOneIsOptional); 

} 

class ServiceObject1 implements ServiceInterface{ 

    public static function create($url, $server){ 
     //.... 
    } 
} 

class ServiceObject2 implements ServiceInterface{ 

    public static function create($methode, $url, $id){ 
     //.... 
    } 
} 
+4

これは、メソッドを別の方法で使用できるようにするインターフェイスを持つのが直感的なものです。インタフェースの目的は、実装クラスをどのように使用するかを正確に知ることです。 1つのサービスが '$ id'を必要としないが、もう1つのサービスが必要であれば、それは依然として必要です。それを無視するだけのサービスです。 –

+0

パブリックstatic function create($ var1、$ var2、$ thisOneIsOptional = '');または配列の場合static static function create($ var1、$ var2、$ thisOneIsOptional = []); –

+1

オプションのパラメータとそれを必要とする実装を持つインタフェースを使用することはできません。これは、署名に互換性がないことを意味します。すべての可能な実装に合うようにインターフェースを一般化できない場合は、インターフェースはあなたが探しているものではありません。 – iainn

答えて

5

インターフェイスを実装するのは適切な方法ではありません。

まず、インターフェイスを使用してクラスを使用する方法を定義し、オプションのパラメータでこの理由が解消される可能性があります。

さらに、2つのパラメータがあっても、それぞれ固有の意味を持つ必要があり、この意味を共有する必要があります。

インタフェースメソッドシグネチャとの間の大きな違いがあります:

public static function create($var1, $var2); 

二つ実装方法:

public static function create($url, $server) 

と:また

public static function create($methode, $url) 

、私の知る限り、この方法を実施しますインターフェイスの署名を変更しているため、厳しい標準違反が発生します。

意味のない共有インターフェイスを作成する必要がある場合は、インターフェイスを共有したり、作成する必要はありません。あなたが行うことができます

0

interface ServiceInterface{ 

    public static function create($url, $server, $id = null); 

} 

class ServiceObject1 implements ServiceInterface{ 

    public static function create($url, $server, $id = null){ 
     //.... 
    } 
} 

class ServiceObject2 implements ServiceInterface{ 

    public static function create($methode, $url, $id = null){ 
     //.... 
    } 
} 

しかし、ServiceObject2はあなたが余分な引数を持つ関数を上書きすることができ、これを行うことで、ServiceObject1を拡張するために簡単に、より論理的ではないでしょう。また、オブジェクトをインタフェースのインスタンスにする代わりに、そのオブジェクトをServiceObject1のインスタンスにする必要があります。

+0

ええ、私はそれをすることができます。私は現在使用しているすべてのモデル(6つのモデル)のサービスクラスを作成する予定です。すべてのモデルがcreateメソッドのパラメータと同じ数になっているわけではありません。私は彼らのすべてのために1つの契約を結んでいいと思った。しかし、スーパークラスを作ることは良い解決策です。それはちょうどそのインターフェイスは構造的により美しいです:) – melkawakibi

+0

@melkawakibi - ちょうど提案; 「美しいもの」、「クールな子供が使うもの」、「ただの理由」を追加することを考えるのではなく、_intuitive_コードを書くことを考えるべきです。私の意見では、それはより美しいです。 –

関連する問題