2013-10-02 13 views
7

適合するものでなければなりませんこれを行う:PHP - - インターフェイスの継承宣言は、私はインターフェイスを持って

interface ExactMapper implements AbstractMapper 
{ 
    public function objectToArray(Product $object); 
} 

またはこれを:

interface ExactMapper extends AbstractMapper 
{ 
    public function objectToArray(Product $object); 
} 

私はエラー

ので、PHPでこれを行う方法がある「宣言は適合するものでなければならない」を持っていますか?

+1

は今が、ここでこのエラーメッセージがやることではない私の2 cents- ですインタフェース継承を使用します。このエラーは、おそらく慣れ親しんでいる他の言語(Java、C++など)のように、PHPが実際の関数/メソッドのオーバーロードをサポートしていないためです。 – anotheruser1488182

答えて

10

いいえ、インターフェイスを実装する必要があります正確に。実装をより特定のサブクラスに制限すると、同じインタフェース/シグネチャではありません。 PHPにはジェネリックやそれに類するメカニズムはありません。あなたはいつも手動もちろん、コードをチェックインすることができます

私はこれが数年前に投稿されました知っている
if (!($object instanceof Product)) { 
    throw new InvalidArgumentException; 
} 
+0

しかし、私はそれに基づいて別のインターフェイスを作成しようとしています。実装しませんが、制限を継承します。 – violarium

+0

拡張して実装するかどうかは実際問題ではありません。インタフェース宣言、期間を変更することはできません。 Barの実装がFooが指定したものよりはるかに制限されている場合、FooはBarを実装するとは言えません。 – deceze

-3
interface iInvokable { 
    function __invoke($arg = null); 
} 

interface iResponder extends iInvokable { 
    /** Bind next responder */ 
    function then(iInvokable $responder); 
} 

class Responder implements iResponder { 

    function __invoke($arg = null) 
    { 
     // TODO: Implement __invoke() method. 
    } 

    /** Bind next responder */ 
    function then(iInvokable $responder) 
    { 
     // TODO: Implement then() method. 
    } 
} 

class OtherResponder implements iResponder { 

    function __invoke($arg = null) 
    { 
     // TODO: Implement __invoke() method. 
    } 

    /** Bind next responder */ 
    function then(iInvokable $responder) 
    { 
     // TODO: Implement then() method. 
    } 
} 

class Invokable implements iInvokable { 

    function __invoke($arg = null) 
    { 
     // TODO: Implement __invoke() method. 
    } 
} 

$responder = new Responder(); 
$responder->then(new OtherResponder()); 
$responder->then(new Invokable()); 
関連する問題