PHP пропустить аргументы функции

242
09 ноября 2017, 06:58

Добрый день. Есть функция:

function lol($a = 1, $b = 2, $c = 3) { 
{

Как можно вызвать эту функцию, изменив только 3ий аргумент, без указания 1го и 2го? Дабы не писать подобный код: lol(1,2,4)

Просто есть функции с длинными дефолтными аргументами, и ищу способ как их не указать.

Update: постараюсь сформулировать понятнее. Допустим в функции, по стандарту аргументы $a = 123456789, $b = 123

Как мне вызвать lol($b = 321) пропустив, и не указав $a? (т.к. оно длинное)

Answer 1
function lol($a = 1, $b = 2, $c = 3) {}

Как мне вызвать lol($b = 321) пропустив, и не указав $a?

Никак.

Описание и все способы передачи аргументов

Answer 2

А задать туда NULL или 0 подойдет? Вы можете задать (0,0,4), коротко и сразу видно что нули не заданы. В функции проверка заданы или нет.

Взятый из английского ресурса StackOverflow:

function foo($blah, $x = null, $y = null) {
    if (null === $x) {
        $x = "some value";
    }
    if (null === $y) {
        $y = "some other value";
    }
    code here!
}

Но вызывать все так же нужно с определенным кол-вом параметров.

foo('blah', null, 'non-default y value');

Где можно задать значения, а можно оставить по умолчанию, как второй параметр тут.

Answer 3

Как Вам уже говорили:

function lol($a=null,$b=null,$c=null){
    $a=!empty($a)?$a:123456789;
    $b=!empty($b)?$b:123;
    $c=!empty($c)?$c:1;
}

Вызывать так: lol(null,345)

В PHP 5.6+ появилось Переменное количество аргументов

Answer 4

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

Пример:

function f($options) {
    extract($options);  // добавить элементы массива в текущую область видимости
    echo $c;
}

Использование:

f(['c' => 42]);  // передаст в функцию число 42

Для удобства применяется функция export, чтобы в одну строчку извлечь содержимое массива в текущую область видимости. Возможно, вы решите, что это способ порождает слишком много ошибок, если тщательно не документировать ваш код. В таком случае, можете выполнять присваивания вашим локальным переменным вручную или напрямую использовать элементы переданного массива, если функция небольшая.

В любом случае надо знать меру и не забывать о читаемости кода.

Answer 5

Один из вариантов, фасадировать функцию:

function lol($a = 1, $b = 2, $c = 3) {}
function lolС($c = 3) {return lol(1, 2, $c);}

Значимыми параметрами по умолчанию, вообще говоря, злоупотреблять не стоит.
В любом случае, имеет смысл замена магических чисел константами с осмысленными именами:

class A {
  const DEF_A = 1;
  const DEF_B = 2;
  function lol($a = self::DEF_A, $b = self::DEF_B) {}
}

тогда проблема передачи значений по умолчанию исчезает:

$a->lol(A::DEF_A, 3);

Ну и стандартное решение - самостоятельная реализация значений по умолчанию:

function lol($a = null, $b = null) {
  $a = $a ?? 1; // php7 coalesce syntax
  $b = $b ?? 2;
}
lol(null, 3);
Answer 6

Да, можно существенно сократить сигнатуру пользовательской функции, если использовать в качестве передаваемого аргумента ассоциативный массив, ключи которого будут именованы в соответствии с переменными из тела фунции. Звучит немного запутано, поэтому публикую поясняющий пример:

// Вызов с параметрами по умолчанию
foo();
// Вызов с любым параметром (остальные по умолчанию)
foo(['b' => 'Новый параметр']);
// Вызов со всеми новыми параметрами 
foo(['a' => 'Значение 1', 'b' => 'Значение 2', 'c' => 'Значение 3']);
function foo() {
    // Массив параметров по умолчанию
    $args = [
        'a' => 123456789,
        'b' => 123,
        'c' => 3
    ];
    extract($args);    
    foreach (func_get_args() as $array) {
        extract($array);
    }
    // И далее работаете с переменными $a, $b, $c
    echo '<pre>', var_dump($a, $b, $c), '</pre>';
}

Результаты:

int(123456789)
int(123)
int(3)
int(123456789)
string(27) "Новый параметр"
int(3)
string(18) "Значение 1"
string(18) "Значение 2"
string(18) "Значение 3"
READ ALSO
Дублируются куки с сервера и клиента

Дублируются куки с сервера и клиента

При создании куки с сервера и клиента, они, если посмотреть в отладчике, сохраняются для разных доменовРазница в них лишь в точке перед именем,...

270
дожидаться ответа сервера (cURL PHP)

дожидаться ответа сервера (cURL PHP)

Добрый день, пожалуйста, помогите, пользуюсь библиотекой cURL (PHP), есть запрос к серверу ВКонтакте URL ($url ):

238
кириллица не записывается в json файл

кириллица не записывается в json файл

Есть формаС нее получаем данные POST'ом

326