Аргументы функций по умолчанию в динамических языках

Динамические языки программирования в целом и PHP в частности позволяют задавать значения по умолчанию для параметров функций и методов.

Можно указывать значения по умолчанию непосредственно в списке параметров:

function example($foo = 5, $bar = 'test') {
    // ...
}

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

Поэтому можно поступить иначе: в качестве формальных значений по умолчанию всегда использовать значение null, а реальные значения по умолчанию инициализировать уже внутри функции:

function example($foo = null, $bar = null) {
    if (null === $foo) {
        $foo = 5;
    }
    if (null === $bar) {
        $bar = 'test';
    }
    // ...
}

Тогда для пропуска любого необязательного параметра достаточно будет указать в качестве его значения унифицированное значение null:

example(null, 'qwerty');

Если же параметров у функции становится слишком много, имеет смысл рассмотреть вариант использования именованных параметров как элементов ассоциативного массива, являющегося единственным (или последним из двух-трёх обязательных либо используемых наиболее часто) формальным параметром функции:

function example($options) {
    $foo = array_key_exists('foo', $options)
         ? $options['foo']
         : 5;

    $bar = array_key_exists('bar', $options)
         ? $options['bar']
         : 'test';

    // ...
}