PHP OOP:每个参数类型的唯一方法?

时间:2010-05-07 14:40:04

标签: php oop orm documentation

我正在写一个小的自制ORM(学术兴趣)。我正在努力坚持TDD概念作为培训练习,作为练习的一部分,我正在编写API的文档,因为我开发了类。

例证 - 我正在研究经典的“getCollection”类型映射器类。我希望它能够为特定用户检索资产X的集合(比如博客文章),以及基于任意数值数组的集合。所以 - 你可能有一个像这些

中的任何一个的方法
$User = $UserMapper->load(1);
$ArticleCollection = $ArticleMapper->getCollection(range(10,20));
$ArticleCollection = $ArticleMapper->getCollection($User);
$ArticleCollection = $ArticleMapper->getCollection($User->getId());

因此,在编写getCollection方法的文档时 - 我想在Docblock中声明@param变量。为每个参数类型设置一个唯一的方法是否更好,或者是否可以使用基于参数类型委托给正确的内部方法/类的方法?

3 个答案:

答案 0 :(得分: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)。您可以使用Class DocBlock中的@method注释来记录这些方法。但请记住,魔术方法总是比直接调用和/或调用适当的方法慢。

使用您认为对您的应用和用例最有意义的内容。

答案 1 :(得分: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) { ... }
}

这似乎是一个很好的方式来做到这一点。

答案 2 :(得分: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
    }
}
[...]