PHP:我能声明一个带有可变数量参数的抽象函数吗?

20

我希望能够在父类中声明一个抽象函数,该函数具有未知数量的参数:

abstract function doStuff(...);

然后使用一组提示的参数定义一个实现:

 /**
 * @param int $userID
 * @param int $serviceproviderID
 */
static function doStuff($userID, $serviceproviderID) {}

到目前为止,我找到的最好方法是这个:

abstract function doStuff();

 /**
 * @param int $userID
 * @param int $serviceproviderID
 */
static function doStuff() {
    $args = func_get_args();
    ...
}

但是每次调用函数时,由于提示信息(hints),我都会得到一堆“缺少参数”的警告。有更好的方法吗?

编辑:问题错了,请不要浪费时间回答。以下是我寻找的内容,它似乎可以在没有警告的情况下正常工作。

abstract class Parent {
    abstract function doStuff();
}

/**
* @param type $arg1
* @param type $arg2
*/
class Child extends Parent {
    function doStuff($arg1, $arg2) {
        ...
    }
}

2
为什么要在接口中将函数定义为抽象的?再说,接口函数必须与其实现具有相同的声明。这就是接口的整个理念。我不知道你的目标是什么,但我认为你一定是想让你的代码尽可能地不清晰和不可用。 - GolezTrol
抱歉,可能我搞砸了这个问题。我没有收到任何警告,所以我想这种方法是可以的。我特别想要多个命名参数,因为它使代码更易读。 - user668660
@GolezTrol - 不好意思,我说错了。它是父类中的一个抽象方法。 - user668660
1
哇,看看php.net上关键字abstract是什么意思。 - kravemir
在接口中允许任意参数似乎是完全合理的。假设您有一个父类,负责连接到API。它定义了一个抽象函数:parseResults(),然后您有该类的子类:Customer、Order、Transaction。这些获取将自然返回任意数量的结果,但底层机制不需要改变。 - eggmatters
显示剩余4条评论
2个回答

12
在PHP 5.6及更高版本中,参数列表可以包括...标记,以表示函数接受可变数量的参数。
您可以将此应用于抽象类,方法如下:
abstract class AbstractExample {
    public function do_something(...$numbers);
}
给定变量将作为一个数组接收参数。

2
这样的函数被称为可变参数函数 - Paul T. Rawkeen
1
结合 list,你可以在一行中为实现函数的参数命名:list($firstParam, $secondParam) = $params; - totymedli

9

根据评论

我特别希望有多个具名参数,因为这样可以使代码更易读。

abstract public function foo ($a, $b=null, $c=null);

如果您想传递任意数量的值,请使用数组。
abstract public function foo ($args);

您应该避免使用“未知数量的参数”,因为这会使事情变得更加困难,而非必要:接口中的方法签名以及抽象方法应该为用户提供提示,说明方法将如何与任何实现一起工作。这是一个重要部分,用户不应该了解任何实现细节。但是,当每个实现的参数数量都不同时,他必须知道具体方法的实现方式。


2
你必须避免在PHP中使用未知数量的参数,因为该语言不允许这样做。但作为一般编码技术,在某些情况下完全可以接受。 - J.Steve
2
@J.Steve 我不知道你的意思,但是PHP允许这样做^^ http://codepad.viper-7.com/UW1ghx - KingCrunch
2
我认为关键在于你处理“未知”数量的参数的唯一方法是声明你期望恰好一个参数(这样PHP就知道它期望一个参数)......只是恰好一个参数可以有任意数量的属性和值。技术上说,PHP允许未知数量的参数并不完全正确。 - niaccurshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接