簡體   English   中英

如何在PHP函數中傳遞特定變量

[英]How to pass specific variable in PHP function

我有一個PHP函數,需要可以采取3參數...我想傳遞第一和第三參數的值,但我希望第二個默認...

如何指定我傳遞的是哪些,否則將其解釋為傳遞第1和第2個插槽的值。

謝謝。

您不能“不傳遞”不在參數列表末尾的參數:

  • 如果要指定第3個參數,則必須傳遞第1個和第2個參數
  • 如果你想指定第二個參數,你必須通過第一個參數 - 但是如果可選,則可以省略第三個參數。

在您的情況下,您必須傳遞第二個參數的值 - 默認值,理想情況下; 哪,是的,要求您知道該默認值。


一個可能的替代方案是你的函數沒有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);

您還可以定義一個空參數集,並使用func_get_args引入參數並使用instanceoftypeof/gettype分析這些參數,以便在您的函數足夠簡單時進行類型檢查。

你可以使用ReflectionFunction。 這個問題已經由php.net的匿名撰稿人解決了,請參閱orinal: http ://www.php.net/manual/en/function.call-user-func-array.php#66121

對於那些希望在PHP中實現按名稱調用功能的人,例如在DB apis中實現,這里是PHP 5及更高版本的快速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);
}
function ($foo, $mate, $bar = "") {
  // ... some code
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM