2010-05-07 17 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

相关问题