在此代码段中,我们输入$inputs['user_id']
3次。
if (isset($inputs['user_id']) && $inputs['user_id']) { // The consumer is passing a user_id
doSomethingWith($inputs['user_id']);
}
我可以采取哪些最具可读性和最强大的重构来避免重复并避免任何关于索引user_id
不存在的通知?
感谢。
答案 0 :(得分:4)
复制没有错。在检查变量是否已设置之前,您无法将$inputs['user_id']
指定给变量,否则会生成Notice undefined index ...
。
这里唯一可以做的就是省略isset
来电并改用!empty
,如下所示:
if(!empty($inputs['user_id'])) {
doSomething($inputs['user_id']);
}
现在您只输入两次并检查
!empty($inputs['user_id'])
等于
isset($inputs['user_id']) && $inputs['user_id']
编辑根据评论,以下是documentation的引用:
以下内容被认为是空的:
"" (an empty string) 0 (0 as an integer) 0.0 (0 as a float) "0" (0 as a string) NULL FALSE array() (an empty array) $var; (a variable declared, but without a value)
因此empty(0)
或empty('0')
将返回true
,这意味着
if(!empty('0') || !empty(0)) { echo "SCREW YOU!"; }
不会回应任何事情 ...或者,我会以礼貌的方式重复上述声明:
!empty($inputs['user_id']) === (isset($inputs['user_id']) && $inputs['user_id'])
通过省略isset
并替换!empty
变量仍然已检查,是否已设置索引,请阅读documentation,其中显示:
如果变量不存在,则不会生成警告。这意味着 empty()基本上简洁等效于!isset($ var)|| $ var == false 。
答案 1 :(得分:1)
这个怎么样:
// put validation check to the function body
function doSomethingWith($userId) {
if($userId === -1) {
// if this is not a valid user id -> return
return;
}
// do something ...
}
// initalize $user with proper default values.
// doing so you can be sure that the index exists
$user = array(
'id' => -1,
'name' => '',
...
);
// merge inputs with default values:
$user = array_merge($user, $request);
// now you can just pass the value:
doSomethingWith($user['id']);
答案 2 :(得分:1)
对于每种情况,下面可能不是最佳方式,但绝对会减少重复。
您的示例代码将变为:
doSomethingWith($inputs['user_id']);
并且你的函数看起来像这个(注意引用提供的参数,以避免未定义的变量警告):
function doSomethingWith(&$userID) {
if (empty($userID)) return;
// ... actual code here ...
}
答案 3 :(得分:0)
假设0
和""
以及null
无效的user_id:
if ($id = $inputs['user_id']) {
doer($id);
}
你也可以使用邪恶@
来避免日志中的通知,(我不喜欢这样):
if ($id = @$inputs['user_id']) {
doer($id);
}