我正在写一个小的自制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变量。为每个参数类型设置一个唯一的方法是否更好,或者是否可以使用基于参数类型委托给正确的内部方法/类的方法?
答案 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
}
}
[...]