PHP - 使用多个变量调用函数

时间:2012-06-04 12:51:06

标签: php function

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

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

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已经设置了,那么如何调用该函数而不必重复$var2$var3的值?

9 个答案:

答案 0 :(得分:4)

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

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

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

    // ...

答案 1 :(得分:0)

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

您可以使用默认值将数组传递给函数,并仅更改$var4值,或将订单更改为建议的nick。

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

Any way to specify optional parameter values in PHP?

答案 2 :(得分:0)

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

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

现在你可以致电:

basicFunction( 0, 3);

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

  1. 如果要省略的参数具有默认值。
  2. 当前参数右侧的所有参数都有默认值。

答案 3 :(得分:0)

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

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

更新:您也可以使用与the first feature here

类似的func_get_args() - 函数

答案 4 :(得分:0)

我刚刚编写了这个函数,可以通过关联数组调用函数。我只是在标量类型上进行了测试,但它应该适用于接收intsfloatsstringsbooleans的函数。我写得非常快,绝对可以通过多种方式改进:

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)
}

答案 5 :(得分:0)

<?php
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);

    /* ... */
}

然后

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

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

答案 6 :(得分:0)

更纯的代码4你(工作100%,php&gt; 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);
}

答案 7 :(得分:-1)

跳过值尝试这样

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

或者如果您设置了值

       // passing values stored in var2,var3

       $var1 = 1;
       $var2 = 2;

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

答案 8 :(得分:-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"];
}

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