2013-06-24 7 views
6

私は、実装がfind、findOrFailなどのメソッドを必要とすることを宣言するインターフェイスを持っています。基本的には、Laravelの雄弁なメソッドです。通知インターフェイスメソッドは__call経由で実装されていますか?

インターフェイスを実装するものすべてが拡張機能を拡張するわけではないので、インターフェイスでこれらのメソッドを宣言するので、インターフェイスで宣言して、メソッドがそこに存在することを常に認識します。

私が知りたいのは、インターフェイスメソッドが__callを介して処理されていることを知らせるための簡単な方法があるが雄弁モデルを拡張行うモデルでpublic function find($id){return parent::find($id)}型メソッドの束を持つ以外、ありますか?

+0

も参照します。https: //bugs.php.net/bug.php?id=41162 –

答えて

3

これは機能しません。 __call()はダイナミックコーディングスタイルにはうってつけですが、インターフェイスでダイナミックメソッドのシグネチャを適用できないため、自動化されたドキュメンテーションを取得できないという欠点があります。

しかし、これらのメソッドのインターフェイスを作成したい場合は、もう__call()を使用する必要はありません。私はちょうどハードコードの方法です。このような設計の清潔さについての大きな疑問があるかもしれませんが、あなたはインターフェイスのメソッドを実装する形質を使って、これに似た何かを達成することができます

+0

デザインに問題があるようです。もっと手伝ってみたいですが、少し曖昧です。基本的な例を表示できますか? – hek2mgl

4

interface FindableContract { 
    public function find($id); 
} 

trait MagicFindableTrait { 
    public function find($id) { 
     return static::__call(__FUNCTION__, func_get_args()); 
    } 
} 

class MagicalParent { 
    public function __call($method, $args) { 
     if ($method == 'find') { 
      return "User " . $args[0] . " is a witch! May we burn her?!"; 
     } 
    } 
} 

class User extends MagicalParent implements FindableContract { 
    use FindableTrait; 
} 

class NonmagicalUser implements FindableContract { 
    public function find($id) { 
     return "User $id was found to be nonmagical. Let's burn him anyway."; 
    } 
} 

print (new User)->find(123); 
print (new NonmagicalUser)->find(321); 
+1

私はそれが本当に賢いと思うので、結局upvoteに決めました。私はそれが本当に賢いと思うので、しばらく私は躊躇した。 –

+1

私はDennisに同意します、これは一般的に非常に悪い考えです。このようなものの主な用途は、学問的/好奇心/かわいらしさです。実際のコードでは使用しないでください。 – Gabriel

関連する問題