PHP: Могу ли я объявить абстрактную функцию с переменным числом аргументов? - PullRequest
12 голосов
/ 15 августа 2011

Я хочу иметь возможность объявлять абстрактную функцию в родительском классе с неизвестным числом аргументов:

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) {
        ...
    }
}

Ответы [ 2 ]

7 голосов
/ 15 августа 2011

По комментарию

Я специально хочу несколько именованных аргументов, так как это делает код более читабельным.

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

Если вы хотите передать произвольное количество значений, используйте массивы

abstract public function foo ($args);

Вам следует избегать «неизвестного числа аргументов», потому что это усложняет и усложняет задачу: сигнатуры методов в интерфейсах, а также абстрактные методы должны подсказывать пользователю, как метод будет работать с любой реализацией. Важно то, что пользователю не нужно ничего знать о деталях реализации. Но когда число аргументов меняется с каждой реализацией, он должен знать, как реализуются конкретные методы.

6 голосов
/ 29 января 2016

В PHP 5.6 и более поздних списках аргументов может содержаться токен ..., обозначающий, что функция принимает переменное число аргументов.

Вы можете применить это к абстрактному классу следующим образом:

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

Аргументы будут переданы в данную переменную в виде массива.

...