我怎么会跳过可选参数的函数调用?我怎么会跳过可选参数的函数调用?(How would I skip

2019-05-14 08:40发布

好吧,我完全忘了如何跳过参数在PHP。

可以说我有:

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

我如何调用该函数使得中间参数使用默认值(即“50”)?

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

将以上是正确的? 我似乎无法得到这个工作。

Answer 1:

您的文章是正确的。

不幸的是,如果你需要在参数列表的最后使用一个可选参数,你必须指定的一切行动,直到最后一个参数。 一般来说,如果你想混合和匹配,你给他们的默认值''null ,并没有使用这些功能里面,如果他们是默认值。



Answer 2:

有没有办法“跳过”,而不是像指定一个默认的其他参数falsenull

由于PHP缺少一些语法糖,当谈到这一点,你经常会看到这样的事情:

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

其中,作为意味深长地说在注释中,使用阵列来模拟命名参数。

这给了极大的灵活性,但可能不会在某些情况下是必要的。 至少,你可以将任何你认为是不是预期的大部分时间参数列表的末尾。



Answer 3:

不,这是不可能跳过的论点这种方式。 您可以省略传递参数当它们在参数列表的末尾。

有此的正式提案: https://wiki.php.net/rfc/skipparams ,这得到了下降。 该提案页面链接到有关此主题的其他SO问题。



Answer 4:

一切都没有改变就能够不过跳过可选参数,正确的语法,并能为我想跳过参数指定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'); 和任何调用该函数在将来不必记住每一次的默认设置或宣布为他们的常数。



Answer 5:

简单的答案是否定的。 但是,为什么跳过重新排列参数达到这个时候?

你是一个“ 函数默认参数不正确的用法 ”和你希望它不会起作用。

从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"

把默认的非违约后您的权利可以确保它永远retun该变量的默认值如果没有定义/给出下面是一个链接以供参考,其中这些例子是从哪里来的。

编辑:如果设置为null为他人所提出的建议可能会工作,是另一种选择,但可能不适合你想要什么。 它将始终设置默认值,如果不将它定义为null。



Answer 6:

对于任何参数跳过(必须)使用默认参数去,是在安全方面。

(稳定的空当默认参数是“”或类似的或反之就会让你陷入troublew ...)



Answer 7:

正如上面提到的,你将无法跳过参数。 我写这个答案提供一些增补,这是太大的评论的地方。

@Frank Nocke 提出要调用的函数,其默认参数,因此例如,具有

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

你应该使用

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

这将在功能上是相同的省略的前两个( $b$c )的参数。

目前尚不清楚哪些是默认值(是0类型提供默认值,或者是重要的?)。

还有一种危险,即默认值问题连接到外部(或内置)功能,当默认值可以通过函数(或方法)的作者进行更改。 所以,如果你将不会改变在节目中电话时,您可能会无意改变自己的行为。

一些解决方法可能是定义一些全局常量,像DEFAULT_A_B这将是和“省略”参数这样“功能A和B参数的默认值”:

$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.

请注意,这个默认常量在整个代码中定义一次(甚至还有在方法声明没有价值),所以在一些意想不到的变化的情况下,你将永远与提供正确的默认值的函数/方法。

该解决方案的清晰度当然比供给原默认值(比如更好的NULL0等),这没什么好说的读者。

(我同意,呼吁像$var = a(,,'ddd');将是最好的选择)



Answer 8:

你不能跳过论点,但你可以使用参数数组,你需要定义只有1个参数,这是一组参数。

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

你可以添加你需要尽可能多的参数,你不需要定义它们。 当你调用该函数,你把你的参数是这样的:

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


Answer 9:

还有其他人已经说了,要不会在功能添加任何代码行不会在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()和参数是“可选”(意味着它有一个默认值)。 如果是的话,我只是将默认值的论点。

演示



Answer 10:

将限制设置为空

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

并调用该函数

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

如果你想设置的限制,你可以作为参数传递

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


Answer 11:

正如前面告知 ,什么都没有改变。 当心,虽然参数太多(尤其是选填的)是代码味道的一个重要指标。

也许你的功能做得太多了:

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

(这是不太正式的只是美化了版本参数阵列技术 )

有时,很之所以提出参数可选是错误的。 在这个例子中,就是$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 */);


Answer 12:

这个片断:


    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
    )



Answer 13:

这是我会做:

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

?>

希望这会帮助别人



Answer 14:

这是一种与一些技术过硬的答案的一个老问题,但它大声呼喊,为现代设计模式在PHP中的一种:面向对象编程。 相反,注入原始标量数据类型的集合,可以考虑使用“注入的对象”,其中包含所有功能所需的全部数据。 http://php.net/manual/en/language.types.intro.php

注入的对象可以有属性验证程序等。如果实例和数据注入到喷射对象是无法通过所有的验证,代码可以立即抛出一个异常,应用程序可避免处理的尴尬过程具有潜在的不完整的数据。

我们可以的类型提示注入的对象捕捉部署之前的错误。 一些观点进行了总结这篇文章从几年前英寸

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



Answer 15:

试试这个。

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

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


Answer 16:

你不能跳过你的函数调用中的参数。 但是,你可以解决这个:

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';
    }
}


Answer 17:

作为@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;
    ...
}
?>

希望这可以帮助。



Answer 18:

getData('some name');

只是不通过他们,默认值将被接受



文章来源: How would I skip optional arguments in a function call?