在这段代码中,我们输入了$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不存在,我可以做的最易读和最健壮的重构是什么?
谢谢。
在这段代码中,我们输入了$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不存在,我可以做的最易读和最健壮的重构是什么?
谢谢。
这里的重复没有错。在检查它是否已设置之前,您不能分配$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']
编辑:根据评论,这是来自文档的引用:
以下内容被认为是空的:
"" (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)or empty('0')will return true,这意味着
if(!empty('0') || !empty(0)) { echo "SCREW YOU!"; }
不会有任何回应......或者,以礼貌的方式,我将重复上面的陈述:
!empty($inputs['user_id']) === (isset($inputs['user_id']) && $inputs['user_id'])
通过省略isset和替换!empty变量仍然检查,索引是否已经设置,请阅读文档,其中说:
如果变量不存在,则不会生成警告。这意味着empty()本质上等同于!isset($var) || $var == 假。
那这个呢:
// 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']);
    下面可能不是每种情况的最佳方法,但绝对可以减少重复。
您的示例代码将变成:
doSomethingWith($inputs['user_id']);
你的函数看起来像这样(注意引用提供的参数,以避免未定义的变量警告):
function doSomethingWith(&$userID) {
   if (empty($userID)) return;
   // ... actual code here ...
}
    假设0and""和null不是有效的 user_ids:
if ($id = $inputs['user_id']) { 
    doer($id);
}
你也可以用邪恶@来避免在你的日志中注意到,(我不喜欢这种方式):
if ($id = @$inputs['user_id']) { 
    doer($id);
}