2012-10-22 24 views
0

可能重複:
PHP OOP: Unique method per argument type?
PHP 5.3 method overloading (like in Java)定義具有相同名稱和不同的參數類型多功能於PHP

我有一些不同的類像用戶和組。我想創建一個通用類來添加該類的屬性。我班有一個像添加,刪除,編輯等 例如一些功能:

<?php 
class Persistence{ 
    function add(Users $userObj){ 
     .... 
    } 
    function add(Groups $groupObj){ 
     .... 
    } 
} 
?> 

我怎樣才能做到這一點?

回答

2

雖然PHP允許鍵入提示,但基於參數類型的方法重載不是。所以你需要爲你的每個案例創建不同的方法,然後使用它們。你可以做什麼,但是,是刪除該類型從附加方法提示,並使用if-else語句或在爭論一個開關來代替:

public function add ($collection) } 
    if($collection instanceof Users) { 
    return $this->addUsers($collection); 
    } 
    if($collection instanceof Groups) { 
    return $this->addGroups($collection); 
    } 
    ... 
    throw new InvalidArgumentException("Unknown collection type"); 
} 

public function addUsers(Users $users) { 
} 

public function addGroups(Groups $groups) { 
} 
+0

這種方式是最好的方式,我認爲 –

+1

我會通過使「addUsers」和「addGroups」爲私有,只提供「add」來改善這一點。 – Clutch

1

像這樣的方法重載是不可能的;您必須削弱聲明中的謂詞:

function add($obj) 
{ 
    if ($obj instanceof Users) { 
    } elseif ($obj instanceof Groups) { 
    } else { 
     throw new Exception("Invalid type for object"); 
    } 
} 
+0

非常感謝。這是最快的答案! –

0

在PHP中,重載僅用於屬性,而不是您可能習慣於的其他語言。您可能會重載__call and __callStatic,但使用繼承更簡單。

0

PHP沒有輸入參數,所以你不能像你的例子那樣做。你可以通過與類型的第二參數,但是並使用該函數中:

function add($type, $object){ 
    if ($type=="user"){ 
     // process $object as a user 
    } elseif ($type=="group"){ 
     // process $object as a group 
    } 
} 
1

另一種解決方案是創建一個界面爲你Persistence類:

interface PersistenceInterface { /* ... */ } 

class Users implements PersistenceInterface { /* ... */ } 
class Groups implements PersistenceInterface { /* ... */ } 

class Persistence 
{ 
    public function add(PersistenceInterface $userObj) 
    { 
     // ... 
    } 
} 

這樣,只有對象標有界面的是您的Persistence類所允許的。

相關問題