2013-06-24 63 views
6

我有一個接口,聲明實現需要的方法,如find,findOrFail等,基本上Laravel雄辯的方法。通知接口方法通過__call實現?

我在界面中聲明瞭這些方法,因爲並非所有實現了界面的東西都會擴展雄辯,所以我在界面中聲明它們,所以我的應用程序總是知道方法將會在那裏。

我想知道的是,比在延長雄辯模型的模型有一堆public function find($id){return parent::find($id)}類型的方法等有一個簡單的方法,讓界面知道該方法是通過__call處理?

+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

最後,我決定放棄,因爲我認爲它非常聰明。我猶豫了一會兒,因爲我覺得它很聰明。 –

+1

我同意丹尼斯,這通常是一個非常糟糕的主意。這樣的主要用途是學術/好奇/可愛。它可能不應該用於現實世界的代碼。 – Gabriel