2012-06-04 17 views
1

这似乎是我知道的一个基本问题,但我一直无法找到答案。PHP - 调用具有多个变量的函数

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

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已经设置,所以我怎么称呼功能n无需重复$var2$var3的值?

+1

您将$ var2和$ var3移动到右侧,并调用basicFunction(0,3)。将可选参数保留在右端。 – mert

+0

这不是他的问题的解决方案 – 2012-06-04 12:55:37

+0

重复问题http://stackoverflow.com/questions/1620737/php-use-default-value-when-calling-a-function。没有回答 –

回答

4

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

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

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

    // ... 
-1

跳过值尝试这样

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

,或者如果u有值设置,那么

 // passing values stored in var2,var3 

     $var1 = 1; 
     $var2 = 2; 

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

如何将这些值分配0值跳过它们? – dm03514

+0

我根据这个问题做了它,否则它会是$ var,然后是它的值。 – Rinzler

+0

@ dm03514将空值传递给您不想指定的参数。没有真正解决它,但它的工作。 – Rinzler

0

你需要把$var2$var3在参数列表

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

现在结束时,您可以拨打:

basicFunction(0, 3); 

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

  1. 如果您要忽略的参数具有默认值。
  2. 当前参数右侧的所有参数都有默认值。
-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"]; 
} 

不过,你最好通过巧妙地重新定位你的论点解决这种情况。

0

你有没有想过传递变量以某种方式排列的? 在这种情况下,你只包括你需要更新变量

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

更新:您可能还使用func_get_args() -function工作方式类似于the first feature here

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

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