PHP - 重构此if语句以避免重复

时间:2013-10-23 15:05:49

标签: php if-statement code-duplication

在此代码段中,我们输入$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不存在的通知?

感谢。

4 个答案:

答案 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'])

编辑2:

通过省略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);
}