Именованные параметры функции в PHP
Возможно ли, чтобы в php
, как в python
, были названы параметры функции? Пример использования:
function foo($username = "", $password = "", $timeout = 10) {
}
Я хочу переопределить $timeout
:
foo("", "", 3);
Гадкий. Я бы предпочел:
foo(timeout=3);
Ответы
Ответ 1
Нет, именованные параметры невозможны в PHP. Технически, когда вы вызываете foo($timeout=3)
, он сначала оценивает $timeout=3
с результатом 3
и передает его в качестве первого параметра в foo()
. А PHP обеспечивает порядок параметров, поэтому сопоставимый вызов должен быть foo("", "", $timeout=3)
. У вас есть два других варианта:
- Пусть ваша функция примет массив в качестве параметра и проверит ключи массива. Я лично нахожу это уродливым, но это работает и читается. Достоинством является простота и возможность добавления новых параметров позже. Недостатком является то, что ваша функция менее самодокументирована, и вы не получите большой помощи от IDE (автозаполнение, быстрый поиск параметров функции и т.д.).
- Настройте функцию без параметров и запросите аргументы в PHP, используя
func_get_args()
, или используйте функцию ...
аргументов переменной длины в PHP 5. 6+. На основании количества параметров вы можете решить, как обрабатывать каждый из них. Многие функции JQuery делают что-то вроде этого. Это легко, но может сбить с толку тех, кто вызывает ваши функции, потому что это также не самодокументирование. И ваши аргументы до сих пор не названы.
Обратите внимание, что есть RFC для именованных параметров, все еще "в стадии обсуждения".
Ответ 2
Старый вопрос, но вот еще немного информации.
Как указано в других ответах, PHP напрямую не поддерживает именованные параметры. VBA - это другой язык, который обладает такой роскошью.
В PHP вы можете использовать довольно разумную замену. Обработка массива PHP особенно хороша, и вы можете использовать ассоциативный массив для передачи массива параметров следующим образом:
function foo($parms=[]) {
$username = parms['username']?:'…';
$password = parms['password']?:'…';
$timeout = parms['timeout']?:'…';
}
foo(['timeout'=>10]);
Обратите внимание на использование оператора ?:
, чтобы разрешить простое значение по умолчанию, если элемент входного массива не существует.
Не так гладко, но именованные параметры играют еще одну важную роль: они позволяют работать с большим количеством опций без чрезмерно длинного списка упорядоченных параметров.
Альтернативный способ написания функции - использовать функцию извлечения:
function foo($parms=[]) {
$username = '…';
$password = '…';
$timeout = '…';
extract($parms,EXTR_IF_EXISTS);
}
Здесь функция extract
копирует значения в переменные, но только если они уже определены. Это предотвращает импорт переменных, о которых вы не знали.
Ответ 3
вы должны использовать другие параметры порядка
foo($timeout=3,$username='',$password='')
или подумайте об использовании
func_get_args