你应该做多少次变量检查?

时间:2013-07-11 12:59:12

标签: php variables

我从未确定过的是在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
}

代码现在更好但是有点过分和膨胀?我应该做这么多检查吗?

如果我不应该做这么多检查,你在哪里划清你应该和不应该检查的界限?

3 个答案:

答案 0 :(得分: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或抛出异常。但当然,这并不总是可取的。

答案 1 :(得分: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

}

答案 2 :(得分:0)

有些人没有注意到的一个问题。警惕使用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
?>

PHPFiddle

与此相比:

$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()做什么以及如何获取数据。如果您不相信它(比如,它基于用户数据),那么您应该执行所有这些检查。如果没有,那么真的没有意义。