Вопрос по php – Как мне пропустить необязательные аргументы при вызове функции?

77

Хорошо, я полностью забыл, как пропустить аргументы в PHP.

Допустим, у меня есть:

function getData($name, $limit = '50', $page = '1') {
    ...
}

Как бы я вызвал эту функцию, чтобы средний параметр принял значение по умолчанию (то есть "50")?

getData('some name', '', '23');

Будет ли вышеупомянутое правильно? Я не могу заставить это работать.

@ Чак Тогда ответ, вероятно, будет: что ничего не изменилось; без обходного пути / кода вы не получите свою функциональность. Rizier123
@ Чак за то, что вы ищете именно? Как обходной путь или класс для реализации этого или ...? Rizier123
Это невозможно пропустить, но вы можете передать аргумент по умолчанию, используяReflectionFunction, Я отправил этоanswer в аналогичном вопросе. David
@ Rizier123 Я спрашиваю, поддерживает ли текущая версия PHP пропуск аргументов (как это делают другие языки). Текущие ответы могут быть устаревшими. Из описания щедрости: «Текущие ответы пять лет. Изменится ли текущая версия PHP? & Quot; Chuck Le Butt
Все ответы здесь предполагают, что вы можете контролировать вызываемую функцию. Если эта функция является частью библиотеки или фреймворка, у вас нет другого выбора, кроме как указать что-то для аргумента 2, если вам нужен аргумент 3. Единственный вариант - найти источник в функции и повторить значение по умолчанию. Snapey

Ваш Ответ

18   ответов
-1

function getData($name, $limit = NULL, $page = '1') {
               if (!$limit){
                 $limit = 50;
               }
}

getData('some name', '', '23');
47

К сожалению, если вам нужно использовать необязательный параметр в самом конце списка параметров, вы должны указать все до последнего параметра. Как правило, если вы хотите смешивать и сопоставлять, вы даете им значения по умолчанию'' или жеnullи не используйте их внутри функции, если они являются значением по умолчанию.

@iamme do$limit = is_numeric($limit) ? $limit : '50'; в началеgetData функция
Можете ли вы привести пример?
5

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

define('DEFAULT_DATA_LIMIT', '50');
define('DEFAULT_DATA_PAGE', '1');

/**
 * getData
 * get a page of data 
 *
 * Parameters:
 *     name - (required) the name of data to obtain
 *     limit - (optional) send NULL to get the default limit: 50
 *     page - (optional) send NULL to get the default page: 1
 * Returns:
 *     a page of data as an array
 */

function getData($name, $limit = NULL, $page = NULL) {
    $limit = ($limit==NULL) ? DEFAULT_DATA_LIMIT : $limit;
    $page = ($page==NULL) ? DEFAULT_DATA_PAGE : $page;
    ...
}

Это можно назвать так:getData('some name',NULL,'23'); и любому, кто вызывает функцию в будущем, не нужно каждый раз вспоминать значения по умолчанию или константу, объявленную для них.

0

как все уже говорили, то, что вы хотите, не будет возможно в PHP без добавления каких-либо строк кода в функцию.

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

foreach((new ReflectionFunction(debug_backtrace()[0]["function"]))->getParameters() as $param) {
    if(empty(${$param->getName()}) && $param->isOptional())
        ${$param->getName()} = $param->getDefaultValue();
}

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

В цикле я просто проверяю, является ли аргумент функцииempty() И аргумент & quot; необязательный & quot; (означает, что он имеет значение по умолчанию). Если да, я просто назначаю значение по умолчанию для аргумента.

Demo

2

вы не сможете пропустить параметры. Я написал этот ответ, чтобы добавить дополнение, которое было слишком велико для того, чтобы добавить его в комментарий.

@Frank Nockeпредлагает чтобы вызвать функцию с параметрами по умолчанию, например, имея

function a($b=0, $c=NULL, $d=''){ //...

вы должны использовать

$var = a(0, NULL, 'ddd'); 

который будет функционально равен опущению первых двух ($b а также$c) параметры.

Не ясно, какие из них по умолчанию (является0 вводится для предоставления значения по умолчанию, или это важно?).

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

Некоторым обходным путем может быть определение некоторых глобальных констант, таких какDEFAULT_A_B который будет "значением по умолчанию параметра B функции A"; и "опустить" параметры таким образом:

$var = a(DEFAULT_A_B, DEFAULT_A_C, 'ddd');

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

class MyObjectClass {
  const DEFAULT_A_B = 0;

  function a($b = self::DEFAULT_A_B){
    // method body
  }
} 
$obj = new MyObjectClass();
$var = $obj->a(MyObjectClass::DEFAULT_A_B); //etc.

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

Понятность этого решения, конечно, лучше, чем предоставление необработанных значений по умолчанию (например,NULL, 0 и т.д.), которые ничего не говорят читателю.

(Я согласен, что звонить как$var = a(,,'ddd'); будет лучшим вариантом)

2

лчанию, чтобы быть на безопасной стороне.

(Если для параметра по умолчанию установлено значение '' 'или аналогичное, или наоборот), вы попадете в затруднительное положение ...)

-2

е обойти это:

function_call('1', '2', '3'); // Pass with parameter.
function_call('1', null, '3'); // Pass without parameter.

Функция:

function function_call($a, $b='50', $c){
    if(isset($b)){
        echo $b;
    }
    else{
        echo '50';
    }
}
Я не уверен, почему у вас отрицательные голоса, за исключением того, что $ c также требуется значение по умолчанию (у вас не может быть никаких обязательных аргументов после необязательного аргумента).
-2

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

<?php
define('DEFAULT_LIMIT', 50);
define('DEFAULT_PAGE', 1);

function getData($name, $limit = null, $page = null) {
    $limit = is_null($limit) ? DEFAULT_LIMIT : $limit;
    $page = is_null($page) ? DEFAULT_PAGE : $page;
    ...
}
?>

Надеюсь это поможет.

Вы просто дублировали ответ. Скорее вы могли бы проголосовать или прокомментировать это.
3

No, Но почему пропустить, когда перестановка аргументов достигает этого?

Ваш & quot;Incorrect usage of default function arguments& Quot; и не будет работать так, как вы ожидаете.

Дополнительное примечание из документации PHP:

When using default arguments, any defaults should be on the right side of any non-default arguments; otherwise, things will not work as expected.

Учтите следующее:

function getData($name, $limit = '50', $page = '1') {
    return "Select * FROM books WHERE name = $name AND page = $page limit $limit";
}

echo getData('some name', '', '23');   // won't work as expected

Выход будет:

"Select * FROM books WHERE name = some name AND page = 23 limit"

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

function getData($name, $page = '1', $limit = '50') {
    return "Select * FROM books WHERE name = $name AND page = $page limit $limit";
}

echo getData('some name', '23');  // works as expected

Выход будет:

"Select * FROM books WHERE name = some name AND page = 23 limit 50"

Установка значения по умолчанию справа от значений, не являющихся значениями по умолчанию, гарантирует, что оно всегда будет возвращать значение по умолчанию для этой переменной, если оно не определено / задано Вотссылка на сайт для справки и откуда эти примеры.

Изменить: Установка его вnull как полагают другие, может работать и является другой альтернативой, но может не подходить для того, что вы хотите. Он всегда будет устанавливать значение по умолчанию, равное нулю, если оно не определено.

0

function getData($name, $limit = null, $page = '1') {
    ...
}

и вызвать эту функцию

getData('some name', null, '23');

если вы хотите установить предел, вы можете передать в качестве аргумента

getData('some name', 50, '23');
-6
getData('some name');

0

Как советовали ранее, Ничего не изменилось. однако, слишком много параметров (особенно необязательных) - сильный индикатор запаха кода.

Возможно, ваша функция делает слишком много:

// first build context
$dataFetcher->setPage(1);
// $dataFetcher->setPageSize(50); // not used here
// then do the job
$dataFetcher->getData('some name');

Некоторые параметры могут быть сгруппированы логически:

$pagination = new Pagination(1 /*, 50*/);
getData('some name', $pagination);
// Java coders will probably be familiar with this form:
getData('some name', new Pagination(1));

В крайнем случае, вы всегда можете ввести специальнуюпараметр объекта:

$param = new GetDataParameter();
$param->setPage(1);
// $param->setPageSize(50); // not used here
getData($param);

(это просто прославленная версия менее формальнойparameter array technique)

Иногда сама причина создания необязательного параметра неверна. В этом примере$page на самом деле означает быть необязательным? Действительно ли сохранение пары символов имеет значение?

// dubious
// it is not obvious at first sight that a parameterless call to "getData()"
// returns only one page of data
function getData($page = 1);

// this makes more sense
function log($message, $timestamp = null /* current time by default */);
2

You can't skip arguments but you can use array parameters and you need to define only 1 parameter, which is an array of parameters.

{
    echo $array_param['name'];
    echo $array_param['age'];
    .............
}

И вы можете добавить столько параметров, сколько вам нужно, вам не нужно определять их. Когда вы вызываете функцию, вы помещаете свои параметры так:

myfunction(array("name" => "Bob","age" => "18", .........));
31

таким образом невозможно пропустить аргументы. Вы можете пропустить передачу аргументовonly если они находятся в конце списка параметров.

Для этого было официальное предложение:https://wiki.php.net/rfc/skipparams, который получил отказался. Страница предложения содержит ссылки на другие вопросы SO по этой теме.

Вы можете найти примеры вPHP documentation
Тогда как функции PHP имеют необязательные параметры «больше / меньше»?
PHP поддерживает значения параметров по умолчанию. Но эти параметры должны быть в конце списка.
Можете ли вы предоставить пример кода этого?
Толчки. Сводит меня с ума. Если вам не нравится функция, которую запрашивает кто-то другой, просто не используйте ее. Интернет иногда худший.
0

тветами, но он требует одного из современных шаблонов проектирования в PHP: объектно-ориентированного программирования. Вместо внедрения коллекции примитивных скалярных типов данных рассмотрите возможность использования «injected-object» который содержит все данные, необходимые для функции. http://php.net/manual/en/language.types.intro.php

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

Мы можем напечатать inject-object, чтобы ловить ошибки перед развертыванием. Некоторые из идей суммированы в этой статье несколько лет назад.

https://www.experts-exchange.com/articles/18409/Using-Named-Parameters-in-PHP-Function-Calls.html

0

    function getData($name, $options) {
       $default = array(
            'limit' => 50,
            'page' => 2,
        );
        $args = array_merge($default, $options);
        print_r($args);
    }

    getData('foo', array());
    getData('foo', array('limit'=>2));
    getData('foo', array('limit'=>10, 'page'=>10));

Ответ:

     Array
    (
        [limit] => 50
        [page] => 2
    )
    Array
    (
        [limit] => 2
        [page] => 2
    )
    Array
    (
        [limit] => 10
        [page] => 10
    )

Ницца. Но небольшое объяснение было бы полезно.
Хороший ответ, но если вы хотите опустить необязательный параметр, сделайте это следующим образом: function getData ($ name, $ args = array ()) {$ defaults = array (& reg; & reg; & reg; & reg; & GT; 2); $ Арг = array_merge ($ по умолчанию, $ арг); } Теперь можно вызывать эту функцию только с первым параметром, подобным этому: getData ('aoo; foo & apos;);
36

отличный от заданного по умолчанию, напримерfalse или жеnull.

Поскольку в PHP нет некоторого синтаксического сахара, когда дело доходит до этого, вы часто будете видеть что-то вроде этого:

checkbox_field(array(
    'name' => 'some name',
    ....
));

Который, как красноречиво сказано в комментариях, использует массивы для эмуляции именованных аргументов.

Это дает максимальную гибкость, но в некоторых случаях может не потребоваться. По крайней мере, вы можете переместить все, что, по вашему мнению, не ожидается, большую часть времени, в конец списка аргументов.

Несмотря на то, что вы более гибки, вы должны помнить параметры, которые вы должны / можете установить (поскольку они не указаны в подписи). Так что, в конце концов, это может быть не так полезно, как кажется, но, конечно, это зависит от контекста.
Я бы идентифицировал «что-то вроде этого» как "использование массивов для эмуляции именованных аргументов", FWIW. :)
Так, что было бы лучшими методами для такого сценария?
Blerg. Хорошо. ;)
0

<?php

    function getData($name, $limit = '', $page = '1') {
            $limit = (EMPTY($limit)) ? 50 : $limit;
            $output = "name=$name&limit=$limit&page=$page";
            return $output;
    }

     echo getData('table');

    /* output name=table&limit=50&page=1 */

     echo getData('table',20);

    /* name=table&limit=20&page=1 */

    echo getData('table','',5);

    /* output name=table&limit=50&page=5 */

    function getData2($name, $limit = NULL, $page = '1') {
            $limit = (ISSET($limit)) ? $limit : 50;
            $output = "name=$name&limit=$limit&page=$page";
            return $output;
    }

    echo getData2('table');

    // /* output name=table&limit=50&page=1 */

    echo getData2('table',20);

    /* output name=table&limit=20&page=1 */

    echo getData2('table',NULL,3);

    /* output name=table&limit=50&page=3 */

?>

Надеюсь, это поможет кому-то

Похожие вопросы