Должен ли я передавать все значения, если в PHP [duplicate] есть много необязательных параметров,

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

Итак, если вы используете Angular, React или любые другие фреймворки, которые делают два способа связывания данных, эта проблема просто исправлена ​​для вас, поэтому простым языком ваш результат undefined на первом этапе, поэтому вы получили result = undefined до получения данных, а затем, как только вы получите результат , он будет обновляться и присваиваться новому значению, которое отвечает на ваш вызов Ajax ...

Но как вы можете сделать это в чистом javascript или jQuery, например, как вы задали этот вопрос?

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

Например, в вашем случае, в котором вы используете jQuery, вы можете сделать что-то вроде этого:

$(document).ready(function(){
    function foo() {
        $.ajax({url: "api/data", success: function(data){
            fooDone(data); //after we have data, we pass it to fooDone
        }});
    };

    function fooDone(data) {
        console.log(data); //fooDone has the data and console.log it
    };

    foo(); //call happens here
});

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

71
задан Chuck Le Butt 19 May 2015 в 09:28
поделиться

15 ответов

Как отметил @IbrahimLawal. Лучше всего установить их в значения 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;
    ...
}
?>

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

-2
ответ дан asp.patrickg 27 August 2018 в 12:01
поделиться

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

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

// 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));

В крайнем случае вы всегда можете ввести ad-hoc объект параметра :

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

(который является просто прославленным версия менее формального метода массива параметров )

Иногда сама причина для создания параметра необязательна. В этом примере $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
ответ дан Community 27 August 2018 в 12:01
поделиться

Вы не можете пропускать аргументы, но можете использовать параметры массива, и вам нужно определить только один параметр, который является массивом параметров.

function myfunction($array_param)
{
    echo $array_param['name'];
    echo $array_param['age'];
    .............
}

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

myfunction(array("name" => "Bob","age" => "18", .........));
29
ответ дан Cristik 27 August 2018 в 12:01
поделиться
getData('some name');

просто не передают их, и значение по умолчанию будет принято

-5
ответ дан davejal 27 August 2018 в 12:01
поделиться

Попробуйте это.

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

getData('some name', '', '23');
-1
ответ дан Dev Danidhariya 27 August 2018 в 12:01
поделиться

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

(Устанавливается значение null, где параметр по умолчанию «или» или наоборот, или наоборот вы в беспокойство ...)

1
ответ дан Frank Nocke 27 August 2018 в 12:01
поделиться

Ничего не изменилось в отношении возможности пропустить необязательные аргументы, однако для правильного синтаксиса и для того, чтобы указать 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');, и любой, кто вызывает функцию в будущем, не должен помнить значения по умолчанию каждый раз или объявленную для них константу.

5
ответ дан Ibrahim Lawal 27 August 2018 в 12:01
поделиться

Это то, что я сделал бы:

<?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 */

?>

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

0
ответ дан Michael Eugene Yuen 27 August 2018 в 12:01
поделиться

Этот фрагмент:


    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
    )

0
ответ дан nobody0day 27 August 2018 в 12:01
поделиться

Невозможно «пропустить» аргумент, кроме как указать значение по умолчанию, например false или null.

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

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

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

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

35
ответ дан Paolo Bergantino 27 August 2018 в 12:01
поделиться

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

У вас есть «Неправильное использование аргументов функции по умолчанию» и не будет работать так, как вы ожидаете.

Замечание из документации PHP:

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

Рассмотрим следующее:

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, как показывают другие, может работать и другая альтернатива, но может не соответствовать тому, что вы хотите. Он всегда будет устанавливать значение по умолчанию равным null, если оно не определено.

3
ответ дан Platinum Industries 27 August 2018 в 12:01
поделиться

Хорошо, как и все остальные сказали, что то, что вы хотите, не будет возможно в 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() И аргумент «необязателен» (означает, что он имеет значение по умолчанию). Если да, я просто присваиваю значение по умолчанию аргументу.

Демо

0
ответ дан Rizier123 27 August 2018 в 12:01
поделиться

Вы не можете пропустить средний параметр в вызове функции. Но вы можете работать с этим:

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';
    }
}
-2
ответ дан Ronak Patel 27 August 2018 в 12:01
поделиться

Установите ограничение на значение null

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

и вызовите эту функцию

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

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

getData('some name', 50, '23');
0
ответ дан utreeworld 27 August 2018 в 12:01
поделиться

Ваше сообщение верное.

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

45
ответ дан zombat 27 August 2018 в 12:01
поделиться
Другие вопросы по тегам:

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