函数参数-数组默认值 |最佳实践

Function parameter - array default value | best practice

为数组定义 default/fallback 值的最佳做法是什么?

描述:

我的函数接受 2 个参数。其中之一是一系列可供选择的选项。如果数组还没有被传递,它有一个 default/fallback 值,如示例:

public function selectName($howMany = 1, $seed = ['john', 'bob', 'mark', 'cindy']){...

支持问题:

a) 在默认参数中存储 filled 数组是个好主意吗?

b) 哪个更好,常数,array_merge, if(empty...?

在我看来,将填充的数组存储在默认参数中不是一个好主意。如果您调用该函数时使用的数组并不包含您需要的每个键怎么办?

示例:

你想要

(default): ['option1' => true, 'option2' => false]
You call the function with: ['option1' => true]

现在您使用数组调用函数,但没有足够的键。所以在我看来,array_merge() 是最好的解决方案。

最好传递一个空数组作为参数。

public function selectName($howMany = 1, $seed = array()){
    $myarr=['john', 'bob', 'mark', 'cindy'];
    if(count($seed)>0){
        $myarr=$seed;
    }
    /* user $myarr now*/
}

由于默认值与所有对象共享,因此最好将它们贴标为 static
建议将可见性降低至 protected

class YourClass {
    protected static $_DEFAULT_SEED     = array('john', 'bob', 'mark', 'cindy');
    protected static $_DEFAULT_QUANTITY = 1;
    public function selectName($howMany = NULL, $seed = NULL){
        if (is_null($howMany)) {
            $howMany    = self::$_DEFAULT_QUANTITY;
        }
        if (is_null($seed)) {
            $seed       = self::$_DEFAULT_SEED;
        }
        //...
    }
}

在我看来,我直接在函数中传递数组值

<?php
public function selectName($howMany = 1, $seed = false){
  $seed = (!$seed) ? array('john', 'bob', 'mark', 'cindy') : $seed;
  // rest of the job ... 
}

或者如果数组在多个函数中使用,我会像这样 class CONSTANT 传递它

CONST SEED_DEFAULT_VALUE = array('john', 'bob', 'mark', 'cindy');

public function selectName($howMany = 1, $seed = false){
  $seed = (!$seed) ? self::SEED_DEFAULT_VALUE : $seed;
  // rest of the job ... 
}

我会这样做的。在这种情况下你可以只设置那个参数,你想改变

function f($array = null) {
   $params = array('a' => '1', 'b' => '2');    // default params
   if ($array) $params = array_replace($params, $array);
   foreach($params as $k => $v)
     echo "$k => $v \n";
}

f();  // a => 1  b => 2 
f(array('b' => "new")); // a => 1 b => new