5

PHP で実行する変数チェックの数は、私が決して確信していませんでした。たとえば、次のコードを見てください。変数を割り当てたり関数に渡したりして、期待するものが含まれているかどうかを確認する前に、変数をチェックしていません

$carId = '12';
$aCar = fetchCar($carId);

$make = $aCar['make'];
$model = $aCar['model'];
$yearMade = $aCar['year'];
$age = calcAge($yearMade);

ここで、いくつかのチェックを追加すると

$carId = '12';

if(is_numeric($carId))
{
    $aCar = fetchCar($carId);

    if(isset($aCar['make']) && is_string($aCar['make']))
    {
        $make = $aCar['make'];
    }
    else
    {
        //Report error
    }

    if(isset($aCar['model']) && is_string($aCar['model']))
    {
       $model = $aCar['model'];
    }
    else
    {
        //Report error
    }

    if(isset($aCar['year']) && is_numeric($aCar['year']))
    {
        $yearMade = $aCar['year'];
        $age = calcAge($yearMade);
    }
    else
    {
        //Report error
    }
}
else
{
    //Report errors
}

コードは改善されましたが、少し過剰で肥大化していませんか? これだけ多くのチェックを行う必要がありますか?

私がこれほど多くのチェックを行うべきではない場合、チェックすべきものとすべきでないものとの境界線をどこで引きますか?

4

3 に答える 3

4

これが動的型言語のジレンマです。fetchCar() 関数が何をしているかに大きく依存します。

私がとるアプローチは、fetchCar が車の配列を返すか、例外をスローしていると仮定することです。これを優れた例外処理ロジックと組み合わせると、クリーンで安定したコードを作成できます。

例えば:

function fetchCar($id) {

    $car = queryDatabaseSomehow();
    if (empty($car)) {
        throw new ExceptionNotFound();
    }
    //eventually you can put your type checking here?
    if (!isset($car['x']) || !is_string($car['x'])) {
        throw new ExceptionDb();
    }
}

echo fetchCar(3)['make'];

また、これを非常に適切に実行して完全に OOP にしたい場合は、Car をメンバーとして make、model、および year を持つクラスにする必要があります。fetchCar() は Car を返すか、Exception をスローします。しかし、これはもちろん常に望ましいとは限りません。

于 2013-07-11T13:08:45.233 に答える
0

むしろ、これらすべてをこれらのケースで再利用できる関数に変えます。

function check_keys($arr_check, $arr_cond) {

    $boo_success = TRUE;
    foreach(array_keys($arr_cond) as $h)
        if (in_array($arr_cond[$h], array('is_string', 'is_numeric'))) {
            if ( ! isset($arr_check[$h]) or ! ($arr_cond[$h]($arr_check[$h]))) {

                $boo_success = FALSE;
                echo "The key {$h} is missing!";
                // If run through a class, $this->errors[] = 'error message';

            }
        } else {

            $boo_success = FALSE;
            echo 'Invalid function';

        }

    return $boo_success;

}

$arr_keys = array('make'  => 'is_string',
                  'model' => 'is_string',
                  'year'  => 'is_numeric');

if (check_keys($aCar, $arr_keys)) {

    // Run successful stuff

}
于 2013-07-11T13:10:04.183 に答える
0

一部の人々が気付いていない1つの問題。使用には注意してくださいis_string

<?php
$var = "test";
$var['something'] = 2;

if(is_string($var['something'])) {
    echo "Hello world!"; // Will echo this because $var is a string!

} else {
    echo "Hello hell!";
}
echo "<br/>";
echo $var['something']; // returns 2
?>

PHPフィドル

これと比較してください:

$var = array('something' => 2);

if(is_string($var['something'])) {
    echo "Hello world!"; // $var is now an array

} else if (is_numeric($var['something'])) {
    echo "Hello hell!"; // Will echo this because $var is string!
}
echo "<br/>";
echo $var['something'];

$var予期しない結果になる可能性があるため、 が配列かどうかを確認する必要があります。isset($var['something'])最初の例では true を返します。

あなたの質問に答えるには、チェックが多すぎるとは思いません。fetchCar()それは、何を行い、どのようにデータを取得するかに大きく依存します。信頼できない場合 (たとえば、ユーザー データに基づいている場合)、これらすべてのチェックを実行する必要があります。そうでなければ、本当に意味がありません。

于 2013-07-11T13:25:13.130 に答える