如何在PHP函数中传递特定变量

如何在PHP函数中传递特定变量,php,function,variables,parameters,Php,Function,Variables,Parameters,我有一个PHP函数,需要可以采取3个参数。。。我想为第一个和第三个参数传递一个值,但我希望第二个参数为默认值 如何指定要传递的插槽,否则将被解释为传递第一个和第二个插槽的值 谢谢。您不能“不传递”不在参数列表末尾的参数: 如果要指定第三个参数,必须传递第一个和第二个参数 如果要指定第二个参数,则必须传递第一个参数,但如果可选,则第三个参数可以省略 在您的情况下,必须为第二个参数传递一个值——理想情况下是默认值;是的,这需要您知道默认值 一种可能的替代方法是不让函数接受3个参数,而只接受一个

我有一个PHP函数,需要可以采取3个参数。。。我想为第一个和第三个参数传递一个值,但我希望第二个参数为默认值

如何指定要传递的插槽,否则将被解释为传递第一个和第二个插槽的值

谢谢。

您不能“不传递”不在参数列表末尾的参数:

  • 如果要指定第三个参数,必须传递第一个和第二个参数
  • 如果要指定第二个参数,则必须传递第一个参数,但如果可选,则第三个参数可以省略
在您的情况下,必须为第二个参数传递一个值——理想情况下是默认值;是的,这需要您知道默认值


一种可能的替代方法是不让函数接受3个参数,而只接受一个,一个数组:

function my_function(array $params = array()) {
    // if set, use $params['first']
    // if set, use $params['third']
    // ...
}
然后像这样调用该函数:

my_function(array(
    'first' => 'plop',
    'third' => 'glop'
));
这将允许您:

  • 接受任意数量的参数
  • 所有这些都是可选的
但是:

  • 您的代码不太容易理解,文档也不太有用:没有命名参数
  • IDE将无法提示函数接受哪些参数

一旦定义了默认参数,就不能要求该参数之后的所有参数。你可以这样做:

const MY_FUNCTION_DEFAULT = "default";

public function myFunction($one, $two = "default", $three = 3)
{
   if (is_null($two)) $two = self::MY_FUNCTION_DEFAULT;
   //...
}

// call
$this->myFunction(1, null, 3);

如果函数足够简单,您还可以定义一个空参数集,并使用它来拉入参数并分析那些使用或用于类型检查的参数。

您可以使用ReflectionFunction。php.net上的匿名贡献者已经解决了此问题,请参见此处的orinal:

对于那些希望在PHP中实现按名称调用功能的人,例如在DB API中实现的人,这里有一个适用于PHP5及以上版本的quick-n-dirty版本
function call_user_func_named($function, $params)
{
    // make sure we do not throw exception if function not found: raise error instead...
    // (oh boy, we do like php 4 better than 5, don't we...)
    if (!function_exists($function))
    {
        trigger_error('call to unexisting function '.$function, E_USER_ERROR);
        return NULL;
    }
    $reflect = new ReflectionFunction($function);
    $real_params = array();
    foreach ($reflect->getParameters() as $i => $param)
    {
        $pname = $param->getName();
        if ($param->isPassedByReference())
        {
            /// @todo shall we raise some warning?
        }
        if (array_key_exists($pname, $params))
        {
            $real_params[] = $params[$pname];
        }
        else if ($param->isDefaultValueAvailable()) {
            $real_params[] = $param->getDefaultValue();
        }
        else
        {
            // missing required parameter: mark an error and exit
            //return new Exception('call to '.$function.' missing parameter nr. '.$i+1);
            trigger_error(sprintf('call to %s missing parameter nr. %d', $function, $i+1), E_USER_ERROR);
            return NULL;
        }
    }
    return call_user_func_array($function, $real_params);
}

是的,我知道^ ^这就是为什么optAuto参数应该在参数列表的右边,而不是在中间;(但是是的,如果第二个和第三个参数都是可选的…)您可以通过一些php函数的巧妙使用来考虑这一点,但是目的很少证明方法的正确性,请参见:我发布了类似的答案。他投赞成票,我投反对票。这是如何工作的?因为在可选参数之后不能有一个必需的参数。此外,这并没有回答将特定变量传递给特定参数的问题,它只显示了如何使用参数创建函数,其中一个参数有一个默认值,使其成为可选参数
function ($foo, $mate, $bar = "") {
  // ... some code
}