PHP下隠しBUG書き方

1810 ワード

隠しBUG一:emptyの誤用
emptyの誤用は,主にいくつかの特殊値に対する判断に現れ,主観的に大きく異なる.例えばempty('')がfalse(スペースを空にする)であり、empty(0)がtrueである.また、このようにempty(getResult()を使用しないように注意する必要があります.そうしないと、PHP Fatal error:Can't use function return value in write contextとエラーが発生する可能性があります.
また、隠しBUGを使用した組み合わせもあります.empty(stripos('dogstar','dog'))がtrueになったのは、戻る位置が0なので、stripos('dogstar','dog')!==false.
隠しBUG 2:数値と文字の等しい判断
次のようなシーンを考えてみましょう.
$status = 'ok';
if ($status == 0) {
    //  1
} else if($status == 'ok') {
    //  2
} else if ($status == 'fail') {
    //  3
} else {
    //  4
}

PHP比較演算子は、判断前に数字の内容に関する文字列が含まれると、文字列が数値に変換され、比較が数値に従って行われるため、上記のコードは常に第2のブランチに入るのではなく、第1のブランチでブロック処理される.つまり、$statusは0に変換され、最終的には$status==0になります.
隠しBUG 3:ループ配列の罠
//$data      
foreach ($data as &$val) {
    //TODO
}

if (!empty($val)) {
    //$val $data         
}

BUG 4を隠す:グローバル変数と一時変数
多くの場合、グローバル変数を使用して内部のパラメータを渡す人がいます.これにより、次のような発見しにくい問題が発生します.
//$config settings ...

doSth();
doSth();//$config will be changed here!

function doSth() {
    global $config;

    foreach ($someData as $config) {
        //...
    }
}

以上の問題は、一時的な変数がグローバル変数と同じ名前の場合、グローバル変数が上書きされることです.グローバル変数は使用しないでください.必要に応じて、グローバル変数の名前を統一して、一般的な一時変数を区別します.たとえば、統一接頭辞や大文字を追加します.
隠しBUG 5:同じ場所で値をフィルタしてください
次のコードを考慮します.
function doSth($id)
{
    if(empty($id)) return false;

    $id = trim($id);
    callOtherFun($id);
}

function callOtherFun($id)
{
    if(empty($id)) throw new Exception('wrong id!');
}

パラメータ$idがスペースの場合、doSth(''')を使用すると異常が放出されます.後のフィルタ割り当て時にフィルタが行われ、前後の判断値が異なるためです.
開発提案:
1、開発中、お問い合わせくださいhttp://www.php.net最も正確なヘルプを得るためのオンラインドキュメント