2011-04-20 107 views
3

我創建了一個名爲iMapper的接口。我希望我的所有映射器文件都能實現這個接口。PHP接口:指定參數列表,但不包含參數類型

但是每個映射器都會指定參數類型。

例子:

interface iMapper 
{ 
    public function insert($obj); 
    public function update($obj); 
    public function delete($obj); 
} 
class CarMapper implements iMapper 
{ 
    public function insert(Car $obj){} 
    public function update(Car $obj){} 
    public function delete(Car $obj){} 
} 

該代碼生成以下錯誤:

Declaration of CarMapper::insert() must be compatible with that of iMapper::insert()

是他們使接口與CarMapper兼容的一種方式? (我不想改變映射器。)

感謝

+0

我做了更新,我的答案:) – dantuch 2011-04-20 20:52:34

回答

2

」但是每個映射器都會指定參數類型。「 - 我不得不說,不能做。

接口必須實現。這是什麼意思?所有實現類必須能夠使用未指定的方法參數 - 接口中方法所需的參數。

調用instanceof方法體內是某種出路,但它是真的不是一個好方法。

閱讀戰略格局,我敢打賭,它可以解決你的問題 - http://sourcemaking.com/design_patterns/strategy/php

+0

聽起來這聽起來完全荒謬,但由於問題更多的是關於可行性而不是實際行爲如何,我認爲這是最好的選擇。謝謝:) – FMaz008 2011-04-20 20:51:50

0
interface iMapper 
{ 
    public function insert(Car $obj); 
    public function update(Car $obj); 
    public function delete(Car $obj); 
} 
class CarMapper implements iMapper 
{ 
    public function insert(Car $obj){} 
    public function update(Car $obj){} 
    public function delete(Car $obj){} 
} 

接口和類方法必須匹配!必須使用相同類型的提示。

+0

也許你是對的,但代碼對我沒有多大幫助。每個對象創建1個接口有什麼意義?我想讓1個接口被許多對象使用...... – FMaz008 2011-04-20 21:00:12

0

你的課必須實現接口。但它不會讓PHP抱怨。

您可能會在方法中使用類型檢查。

看一看instanceof。 「

2

更好:

interface iObject {} 

class Car implements iObject 

interface iMapper 
{ 
    public function insert(iObject $obj); 
    public function update(iObject $obj); 
    public function delete(iObject $obj); 
} 
class CarMapper implements iMapper 
{ 
    public function insert(Car $obj){} 
    public function update(Car $obj){} 
    public function delete(Car $obj){} 
} 
+0

更好,以便接口方法iMapper的參數可以採取任何對象實現接口iObject(不只是對象汽車) – Aleks 2013-07-25 13:17:33

+0

看起來很誘人,但它不會工作,因爲實現必須與聲明的接口兼容。因此,而不是CarMapper :: insert(Car)它必須被實現爲CarMapper :: insert(iObject)。 – 2013-12-09 23:26:45