问题 PHP:我可以使用可变数量的参数声明一个抽象函数吗?


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

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();
    ...
}

但每次调用函数时,由于提示,我都会收到一堆“缺少参数”的警告。有没有更好的办法?

编辑:问题是错的,请不要浪费你的时间回答。以下是我正在寻找的东西,似乎没有任何警告。

abstract class Parent {
    abstract function doStuff();
}

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

2885
2017-08-15 18:13


起源

你有没有考虑过以数组的形式提出你的论点? - w0bni
为什么要在接口中将函数定义为抽象?然后,接口函数必须具有与其实现相同的声明。这就是接口的全部概念。我不知道你的目标是什么,但我认为你必须努力使你的代码尽可能不清楚和无法使用。 - GolezTrol
嗯,对不起,我可能搞砸了这个问题。我 不 得到任何警告,所以我猜这种方法是可以的。我特别想要多个命名参数,因为它使代码更具可读性。
当你真的想要提供一个带有未知数量参数的抽象方法时,你可能并没有真正想过它。您通常定义摘要方法,因此每个人都可以扩展该类,其他人可以使用任何实现而无需了解其具体细节,但用户的参数数量未知 必须 知道细节。 - KingCrunch
OMG,看看php.net什么是关键字 abstract 对于。 - kravemir


答案:


根据评论

我特别想要多个命名参数,因为它使代码更具可读性。

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

如果要传递任意数量的值,请使用数组

abstract public function foo ($args);

你应该避免“未知数量的参数”,因为它使事情变得更加困难,然后是必要的:接口中的方法签名以及抽象方法应该给用户一个提示,该方法如何与任何实现一起工作。它是一个重要的部分,用户不需要知道有关实现细节的任何信息。但是当参数的数量随着每个实现而变化时,他 必须 知道,具体方法是如何实施的。


6
2017-08-15 18:23



好吧,你 必须 避免在PHP中使用未知数量的参数,因为该语言不允许这样做。但作为一种通用的编码技术,它在某些情况下是完全可以接受的。 - J.Steve
@ J.Steve我不知道,如果我明白你的观点,但PHP允许它^^ codepad.viper-7.com/UW1ghx - KingCrunch
我认为关键是你可以处理“未知”数量的参数的唯一方法是声明你只期望一个参数(这样PHP就知道它需要一个参数)......只是发生了一个参数可以有任何参数其中的属性和值的数量。从技术上来说,PHP不允许使用未知数量的参数。 - niaccurshi


在PHP 5.6及更高版本中,参数列表可能包含 ... token表示该函数接受可变数量的参数。

您可以将此应用于抽象类,如下所示:

abstract class AbstractExample {
    public function do_something(...$numbers);
}

参数将作为数组传递给给定变量。


5
2018-01-29 17:59



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