1

这似乎是我知道的一个基本问题,但我一直无法找到答案。

让我们假设一个基本功能:

function basicFunction ( $var1, $var2 = 1, $var3 = 2, $var4 = 5 )
{
// Do some stuff
// Return
}

现在假设我想使用以下变量调用该函数:

$var1 = 0

$var2 = 1

$var3 = 2

$var4 = 3

我可以做这个:

$someResult = basicFunction( 0, 1, 2, 3 );

$var2并且$var3已经设置好了,那么我将如何调用该函数而不必重复$var2and的值$var3

4

9 回答 9

4

PHP 不支持重载。因此,如果您不将它们移动到参数列表的最右侧,则不能以任何方式跳过它们。

一种常见的解决方案是设置与预期不同类型的默认值(即 NULL)。然后在函数中设置实际的默认值。这种方法不是很干净,需要一些额外的代码行,但如果情况需要,你可以这样做:

function basicFunction($var1, $var2 = NULL, $var3 = NULL, $var4 = NULL) {
    if ($var2 === NULL) {
        $var2 = 1;
    }

    // ...
于 2012-06-04T13:03:26.227 回答
1

现在可以使用 PHP 8,有关详细信息,请参阅此答案https://stackoverflow.com/a/64997399/519333


老答案:

function my_function(
    $id,
    $start = 0,
    $limit = 10,
    $filter = false,
    $include_duplicates => false,
    $optimize_fetch => false,
    $cache = false
) {
    if (is_array($id)) extract($id, EXTR_IF_EXISTS);

    /* ... */
}

进而

my_function(array('id' => 1, 'cache' => true));

资料来源: http: //www.marco.org/2008/11/11/faking-named-parameters-in-php

于 2012-06-11T16:39:22.727 回答
0

不幸的是,我不认为 php 那样工作。
如果您要更改$var4,则必须包含它们$var2$var3因为它们$var4位于函数声明之前。

您可以使用默认值将数组传递给函数,并且只更改$var4值,或者按照 nickb 的建议更改顺序。

http://www.php.net/manual/en/functions.arguments.php#functions.arguments.default

有什么方法可以在 PHP 中指定可选参数值?

于 2012-06-04T12:59:35.527 回答
0

您需要将$var2$var3放在参数列表的末尾

function basicFunction ( $var1, $var4 = 5, $var2 = 1, $var3 = 2)

现在您可以致电:

basicFunction( 0, 3);

否则,您将必须指定所有参数。调用函数时,必须从左到右指定所有参数。唯一可以省略参数的情况是:

  1. 如果要省略的参数具有默认值。
  2. 当前参数右侧的所有参数都具有默认值。
于 2012-06-04T13:01:34.260 回答
0

您是否想过以某种方式将变量作为数组传递?在这种情况下,您只包含需要更新的变量

function basicFunction ( $arrayvar ){
    $arrayvar['var1']...

更新:您也可以使用与此处的第一个功能func_get_args()类似的 -function

于 2012-06-04T13:05:08.893 回答
0

我刚刚编写了这个函数,它允许您通过关联数组调用函数。虽然我只在标量类型上测试过它,但它应该适用于接受ints, floats,stringsbooleans. 我写得很快,它肯定可以通过多种方式改进:

function call_user_func_assoc($function, $array){
    $matches = array();
    $result = array();
    $length = preg_match_all('/Parameter #(\d+) \[ <(required|optional)> \$(\w+)(?: = (.*))? ]/', new ReflectionFunction($function), $matches);

    for($i = 0; $i < $length; $i++){
        if(isset($array[$matches[3][$i]]))
            $result[$i] = $array[$matches[3][$i]];
        else if($matches[2][$i] == 'optional')
            $result[$i] = eval('return ' . $matches[4][$i] . ';');
        else
            throw new ErrorException('Missing required parameter: $' . $matches[3][$i]);         
    }

    call_user_func_array($function, $result);
}

你可以像这样使用它:

function basicFunction($var1, $var2 = "default string", $var3 = 2, $var4 = 5){
    var_dump(func_get_args());
}

call_user_func_assoc('basicFunction', array('var1' => "Bob", 'var4' => 30));

哪个输出:

array(4) {
  [0]=>
  string(3) "Bob"
  [1]=>
  string(14) "default string"
  [2]=>
  int(2)
  [3]=>
  int(30)
}
于 2012-06-04T13:53:45.070 回答
0

更纯代码 4 你(工作 100%,php>5.3),使用类和函数。

  function call_user_func_assoc($function, $array){
    if ((is_string($function)) && (count(explode('::',$function))>1))
        $function = explode('::',$function);

    $func = ((is_array($function)) || (count($function)>1)) ? new ReflectionMethod($function[0], $function[1]) : new ReflectionFunction($function);

    foreach($func->getParameters() as $key => $param) {
        if (isset($array[$key]))
            $result[$key] = $array[$key];
        elseif(isset($array[$param->name]))
            $result[$key] = $array[$param->name];
        else
            $result[$key] = $param->getDefaultValue();
    }
    return call_user_func_array($function, $result);
}
于 2013-06-20T00:43:39.447 回答
-1

跳过值试试这样

     $someResult = basicFunction( 0, 0, 0, 3 ); 

或者,如果您设置了值,那么

       // passing values stored in var2,var3

       $var1 = 1;
       $var2 = 2;

    $someResult = basicFunction( 0, $var1, $var2, 3 );
于 2012-06-04T12:57:56.057 回答
-1

正如我在上面的评论中提到的,您应该始终将可选变量保留在右端,因为 php 参数从左到右进行评估。但是,对于这种情况,您可以采取一些技巧来消除重复值,如下所示:

$var2 = 1, $var3 = 2, $var4 = 5;
function basicFunction($var1, $var2 = null, $var3 = null, $var4 = null) {
    if($var2 === null)
        $var2 = $GLOBALS["var2"];
    if($var3 === null)
        $var3 = $GLOBALS["var3"];
    if($var4 === null)
        $var4 = $GLOBALS["var4"];
}

但是,您最好通过巧妙地重新定位参数来解决这种情况。

于 2012-06-04T13:03:13.697 回答