3

このコード スニペットでは、$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

4 に答える 4

4

ここでは、複製に問題はありません。$inputs['user_id']変数が設定されているかどうかを確認する前に変数に代入することはできませんNotice undefined index ...

ここでできる唯一のことは、次のように、isset呼び出しを省略して!empty代わりに使用することです。

if(!empty($inputs['user_id'])) {
    doSomething($inputs['user_id']);
}

今、あなたはそれを2回入力するだけで、チェック

!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)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

変数が存在しない場合、警告は生成されません。つまり、empty()は本質的に!isset($var) ||と同等の簡潔なものです。$var == false .

于 2013-10-23T15:10:13.113 に答える
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']);
于 2013-10-23T15:12:33.533 に答える
0

およびが有効な user_ids ではない0と仮定します。""null

if ($id = $inputs['user_id']) { 
    doer($id);
}

@ログに通知されないように悪を行うこともできます (私はこの方法が好きではありません)。

if ($id = @$inputs['user_id']) { 
    doer($id);
}
于 2013-10-23T15:12:21.917 に答える