2010-04-18 72 views
0

我們可以限制方法參數的類型;例如,我們應該說函數參數應該是一個名爲「Some Class」的類中描述的對象的實例。限制具有兩個或更多類名稱的方法參數的類型?

function some_function(Some_Class $object) { 
} 

是否有任何PHP本地posibilities限制方法參數與兩個或多個類?例如,「某些類」或「某些類2」或「某些類3」。

或者也許有什麼辦法來限制方法參數與類實現接口名稱「Some_Interface」?

謝謝。

回答

3

你可以用interface來做,

interface LoggableInterface 
{ 
    public function log($message); 
} 

實現接口

class FileLog implements LoggableInterface { 
    public function log() { /* code to log to File ... */ } 
} 

class DbLog implements LoggableInterface { 
    public function log() { /* code to log to Db ... */ } 
} 

class SysLog implements LoggableInterface { 
    public function log() { /* code to log to SysLog ... */ } 
} 

然後你可以使用它作爲一個TypeHint一些像這樣的類:

function some_function(LoggableInterface $anyLogger); 

這樣,你要確保帕拉姆傳遞給some_function()有一個方法log()。不管你傳遞給它的具體是哪個(FileLog,DbLogSysLog),只是這些類實現了接口。

+0

請你能告訴我,我該怎麼辦?我該如何申報?方法(Interface_Name $ class)或s/th方法(實現Interface_Name $ class)。謝謝! – Kirzilla 2010-04-18 21:40:54

+0

@Kirzilla如上所示。你需要哪部分幫助? – Gordon 2010-04-18 21:44:40

+0

對不起,我已在您的答案的第一版後立即發佈評論。非常感謝您的詳細解答。 – Kirzilla 2010-04-18 21:49:21

0

你應該使用類繼承或接口來做到這一點。

0

原則上不是,但你可以僞造它:由於PHP是一種動態語言,類型錯誤在運行時發生;你可以手動在你的函數開始加入這樣的事情引發的錯誤:

if(check_any_type_constraints_here) 
    trigger_error("Argument is not valid!", E_USER_ERROR); 

爲了崩潰的腳本,它將作爲可靠地工作,因爲PHP內置的參數類型檢查)。

你只需要確保,如果你在方法參數列表中添加一個實際約束,所有有效的值都能夠通過它(你不需要確保所有的無效值都會使檢查失敗,這就是手動檢查是什麼)。對於OR'ing類型,實現此目的最安全的方法是不在頭中聲明類型,並完全依賴手動檢查。如果你想要AND類型(比如你想要一個實現兩個或多個特定接口的值),那麼你可以把它放在頭上(最好是最有可能失敗的頭),並檢查其他的身體。

希望這會有所幫助。

相關問題