Именованные параметры функции в 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