2013-07-11 66 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']; 

此外,如果你想做到這一點的超級正確和充分走OOP,汽車應成爲品牌,型號和年份作爲其成員的類。 fetchCar()將返回Car或拋出Exception。但是,這當然不總是可取的。

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

聰明。但要注意它會如何超級慢。 – 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()做什麼以及它如何獲取數據。如果您不能相信它(例如,它基於用戶數據),那麼您應該執行所有這些檢查。如果沒有,那麼真的沒有意義。