Как написать функцию с необязательным аргументом и аргументами переменной длины? - PullRequest
2 голосов
/ 29 марта 2019

Я хочу реализовать метод внутри класса следующим образом:

class Query {
    public function orderBy($dir="asc", ...$fields){}
}

Где $dir - аргумент по умолчанию, а $field - аргумент переменной длины с использованием токена (...).

Проблема в том, что аргумент переменной длины должен быть объявлен в конце, и когда я делаю это, разработчик не может пропустить первый аргумент по умолчанию. Как я могу это исправить?

Обратите внимание, что я не хочу использовать func_get_args(), потому что я хочу, чтобы у разработчика были некоторые подсказки типа.

1 Ответ

1 голос
/ 30 марта 2019

Это просто не выполнимо.PHP не поддерживает это, и не имеет большого смысла, что это будет.Единственный способ, которым это может сработать, - это присвоить именованные аргументы, как и в некоторых других языках, делая порядок аргументов неуместным.

Кроме того, ваше требование использовать аргумент с переменным числом аргументов является искусственным и не очень полезным.Просто используйте массив и необязательный аргумент порядка.

Например:

function orderBy(array $columns, string $order = 'asc') {
    // do your thing
}

Точнее, проще для понимания пользователями метода и соответствует синтаксису языка.

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

orderBy(["column1", "column5"]);

orderBy(["column2"], 'desc');
...