Php 函数参数:函数的默认值返回?
我有许多带有可选参数的函数,这些函数在省略的值上从指定的函数获取其默认值,目前我的代码如下所示:Php 函数参数:函数的默认值返回?,php,function,arguments,optional-arguments,Php,Function,Arguments,Optional Arguments,我有许多带有可选参数的函数,这些函数在省略的值上从指定的函数获取其默认值,目前我的代码如下所示: 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 } function
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
}
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;
}
它工作得很好,但是当有多个可选参数时,它很容易变得非常clutty。相反,我更愿意做如下事情:
function get_user($user_id = get_id_from_session()) {
// ... do something with the ID
}
我相信你会发现这样更方便有没有办法做到这一点,或者有没有人对另一种更干净的方法有什么建议?唯一可以“缩短”的方法是使用:
这只是一个简洁的写作版本:
if( $user_id === false) {
$user_id = get_id_from_session();
}
如果您想变得更花哨、可读性更低,可以省略中间部分(PHP>5.3):
现在,如果
($user\u id)
的计算结果为true,您将在$user\u id
中获得$user\u id
的值,否则您将从函数中获得返回值。默认函数参数只能采用常量值,而不是在运行时计算的表达式,因此第二个选项将不起作用
我有一个想法是这样的
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\u defaults()
函数可能如下所示:
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
}
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\u 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
}
它确实缩短了代码,但在我看来,可读性变得越来越差。@Zar:任何其他达到相同效果的技巧也会破坏可读性。