2013-07-11 3 views
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 
} 

код теперь лучше, но слишком ли он чрезмерен и раздувается? Должен ли я делать это много проверок?

Если я не должен делать это много проверок, где вы рисуете линию между тем, что вы должны и не должны проверять?

+0

У вас есть синтаксическая ошибка в вашем коде, вы открываете свой 'isset (', но не закрываете его. – MMM

+2

Зависит. Каковы все возможные возвращаемые значения для 'fetchCar()'? Учитывайте это и выполняйте проверки вам нужно убедиться, что ваш скрипт будет работать без ошибок. –

+0

@MMM Спасибо, я изменил эти – Pattle

ответ

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']; 

Кроме того, если вы хотели бы сделать это супер-собственно и идти полностью ООП, автомобиль должен стать классом с марку, модель и год в качестве его членов. fetchCar() вернет автомобиль или выбросит исключение. Но это не всегда желательно, конечно.

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 

} 
+0

не все должно быть строкой – kajacx

+0

Отмечено и скорректировано. –

+0

smart.но заметьте, как супер-медленный он будет работать. – fsw

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() и как он получает данные. Если вы не можете доверять ему (скажем, он основан на пользовательских данных), вы должны выполнить все эти проверки. Если нет, то на самом деле нет смысла.

Смежные вопросы