2010-05-07 13 views
3

我正在寫一點自制ORM(學術興趣)。我試圖堅持TDD概念作爲培訓練習,並且作爲該練習的一部分,我正在爲API開發文檔,以便開發課程。PHP OOP:每個參數類型的唯一方法?

案例 - 我正在研究一個經典的「getCollection」類型的映射類。我希望它能夠爲特定用戶檢索資產X的集合(比方說博客文章),還可以基於任意數值數組獲取集合。所以 - 你可能喜歡這些

$User = $UserMapper->load(1); 
$ArticleCollection = $ArticleMapper->getCollection(range(10,20)); 
$ArticleCollection = $ArticleMapper->getCollection($User); 
$ArticleCollection = $ArticleMapper->getCollection($User->getId()); 

因此,任何一個的方法,以書面形式對getCollection方法的文檔 - 我要聲明的文檔塊的@param變量。對每個參數類型有一個唯一的方法會更好嗎?還是有一種方法可以根據參數類型委託給正確的內部方法/類?

回答

6

有一個委託給正確的內部方法的方法是可以接受的。再次

@param Array|User|Integer $argName optional explanation 

但隨後,有沒有人攔住你有一個方法每個

public function getCollectionByRange(array $range) 
public function getCollectionByUser(User $user) 
public function getCollectionByUserId($id) 

此外,您可以使用magic __call method假裝上述方法存在和:你可以像這樣將其記錄下來然後捕獲方法調用並將其委託給您的內部方法(ZF does that f.i. for finding dependant database rows)。您將在DocBlock類中使用@method註釋記錄這些方法。但請記住,魔術方法總是比直接調用和/或調用適當的方法要慢。

使用您認爲最適合您的應用程序和用例。

1

聽起來像你想要做的功能重載,但PHP(甚至PHP5)不會像你會在Java中那樣重載。在PHP手冊的Overloading section不是function overloading

注: PHP的解釋「超載」是比大多數 面向對象的語言不同。超載 傳統上提供了 具有多種方法的能力,它們具有相同的 名稱但不同的數量和 類型的參數。

你可能是說:

class ArticleMapper { 
    public function getCollection($param) { 
     if (is_array($param)) { $this->getCollectionByArray($param); } 
     if (is_int($param)) { $this->getCollectionByInt($param); } 
     if (is_a($param, 'User')) { $this->getCollectionByUser($param); } 
    } 
    private function getCollectionByArray(array $param) { ... } 
    private function getCollectionByInt($param) { ... } 
    private function getCollectionByUser(User $param) { ... } 
} 

這似乎是一個很好的方法把它做我的眼睛。

+0

感謝,我很欣賞這個答案,並且非常接近我最初的實現。我很想知道的是,從面向對象的最佳實踐角度來看,使用獨特的方法re:責任更好嗎? – sunwukung 2010-05-07 15:03:00

+0

嗯,好點:http://php.net/manual/en/language.oop5.typehinting.php我會從我的答案中刪除錯誤'int'。 – artlung 2010-05-07 15:20:43

1

你可以通過檢查傳入的參數在運行時的類型實現類似method overloading(PHP不支持這個概念來自像ADA,Java和C#或C++如別的語言):

[...] 
/** 
* @param User|array|integer $user 
* @return array 
*/ 
public function getCollection($user) { 
    // perhaps a switch-case would be better here 
    if ($user instanceof User) { 
     // do what has to be done if you passed in a User object 
    } else if (is_int($user) { 
     // do what has to be done if you passed in a user id 
    } else if (is_array($user)) { 
     // do what has to be done if you passed in an array of user ids 
    } 
} 
[...] 
+0

感謝您的回答 - 但是,我對如何而不是感興趣,而不是對原因(或什麼被認爲是「最佳實踐」)感興趣 – sunwukung 2010-05-07 15:03:51

+0

「使用您認爲最適合您的應用程序和用例的東西。」 - 戈登26分鐘前補充說,我想。我認爲沒有最好的方法,因爲大部分時間:這取決於。我個人會採用單一方法,因爲它保持了API的整潔。 – 2010-05-07 15:37:08

相關問題