函数参数-数组默认值 |最佳实践
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
为数组定义 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