Вопрос по функциям php (аргументы по умолчанию)?

Случился небольшой затык с пониманием такой темы как "функции: аргументы по умолчанию".
Сначала, все понятно, есть функция: myfunc ($arg1, $arg2, $arg3 = null, $arg4 = null);
Если вызываем функцию так: myfunc(1, 2);
то вместо не указанных 3-го и 4-го параметров будут выведены null. Так же если вызвать эту функцию без 4-го аргумента, то только вместо него будет выведен null.
Мне не понятно, возможно ли каким-то образом вызвать данную функцию таким образом, чтобы не был указан 3-ий аргумент и вместо него выводилось значение по-умолчанию?
  • Вопрос задан
  • 3952 просмотра
Решения вопроса 2
nazarpc
@nazarpc
Open Source enthusiast
Только указать это значение явно, пропустить никак не получится
Ответ написан
Комментировать
только если так:
myfunc(1, 2, NULL, 4);
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
kreexus
@kreexus
А ещё можно не указывать аргументы функции явно, а воспользоваться динамическими аргументами. В этом поможет функция func_get_args(). И в теле уже самой функции просто валидировать получаемые функцией аргументы. Конечный результат будет таким:

function myfunc()
{
    var_dump(func_get_args());
}

myfunc(1, 2, 3, 4);
myfunc(1, 2, 4);
myfunc(1, 5, 6, 7, 8, 9);

Плюс тебе в помощь функции func_num_args() и func_get_arg().

Хотя я больше за вариант от dkorshunov:

myfunc(1, 2, NULL, 4);
Ответ написан
Комментировать
@m-haritonov
Для этого необходима поддержка языком синтаксиса вызова функции наподобие:
myfunc(1, 2, , 4);
PHP такого синтаксиса, к сожалению, не предоставляет.

UPDATE 2022:
В PHP 8 появились именованные аргументы - https://www.php.net/manual/ru/functions.arguments.....
Теперь это возможно:
function test($a = 1, $b = 2) {
    print "a: $a, b: $b";
}
test(b: 5); // Выведет "a: 1, b: 5"
Ответ написан
Комментировать
@Jailbird
Читал что такое возможно будет в php 5.6, но тогда это было на стадии обсуждения, так что чем закончится не знаю. В релизе увидим )
Ответ написан
Комментировать
seelts
@seelts
Web-, Android-, iOS-разработчик
Есть ещё вариант именованных аргументов.
В ПХП их настоящих ещё нет, но можно заменить на ассоциативный массив:

function box ($options = array('x' => 0, 'y' => 0, 'width' => 100, 'height' => 100)) {
    ...
    if (!isset($options['width'])) {
        $options['width'] = 100;
    }
    ....
}

box();
box(array('x' => 50, 'y' => 25));
box(array('x' => 50, 'y' => 25, 'height' => 414));
Ответ написан
Комментировать
Dier_Sergio_Great
@Dier_Sergio_Great
Увлеченный человек
Это стало возможным в PHP 8
это может создаваться так чтобы в аргументах писались имена аргументов, таким образом чтобы явно указать 1й, 2й и 4й аргумент по именам. Но пока что этого НЕТ.
box(oneArg: 1, twoArg: 2, fourArg: 4);
box(fourArg: 4);
box(twoArg: 2);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы