我有许多带有可选参数的函数,在省略的值上从指定函数获取其默认值,目前我的代码看起来像这样:
function get_user($user_id = FALSE) {
// If no ID is passed, get from session
if(!$user_id) {
$user_id = get_id_from_session();
}
// ... do something with the ID
}
它运行正常,但是当有多个可选参数时,它很容易变得非常 clutty 。相反,我更愿意做以下事情:
function get_user($user_id = get_id_from_session()) {
// ... do something with the ID
}
我相信你可以看到这样更方便。 有没有办法实现这一目标,或者有人建议采用另一种更清洁的方法来做到这一点吗?
答案 0 :(得分:4)
您可以“缩短”这一点的唯一方法是使用ternary operator:
$user_id = ( $user_id === false) ? get_id_from_session() : $user_id;
这只是一个紧凑的写作版本:
if( $user_id === false) {
$user_id = get_id_from_session();
}
如果你想要真正的花哨和不太可读,你可以省略中间部分(PHP> 5.3):
$user_id = ( $user_id) ?: get_id_from_session();
现在,如果( $user_id)
评估为true,则$user_id
中的值为$user_id
,否则您将从函数中获得返回值。
答案 1 :(得分:3)
默认函数参数只能采用常量值,而不是在运行时计算的表达式,因此第二个选项不起作用。
我有一个想法是这样的。
function foo($user_id = null) {
$data = get_defaults('user_id' => $user_id);
extract($data);
echo $user_id; // should be the value returned from get_defaults()
}
get_defaults()
函数可能如下所示:
function get_defaults(array $params) {
if (isset($params['user_id']) && is_null($params['user_id'])) {
$params['user_id'] = get_id_from_session();
}
if (isset($params['something_else']) && !isValidSomething($params['something_else'])) {
$params['something_else'] = get_something_else();
}
return $params;
}
您只需根据特定被调用函数所期望的参数将数组传递给get_defaults()
函数。另一个例子是:
function bar($baz, $user_id = null, $user_name = null, $return = null) {
$data = get_defaults(array('return' => $return,
'user_name' => $user_name,
'user_id' => $user_id));
extract($data);
// normal function code below
}