2013-07-11 7 views
5

Etwas, über das ich nie sicher war, ist, wie viele Variablenprüfungen man in PHP machen sollte. Nimm zum Beispiel das folgende Stück Code. Ich bin nicht eine der Variablen überprüfen, bevor ich sie abzutreten oder an eine Funktion, um zu sehen, ob sie enthalten, was ichWie viele variable Überprüfungen sollten Sie durchführen?

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

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

Jetzt erwarten, wenn ich einige Prüfungen

$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 
} 

Der Code jetzt hinzufügen, ist besser aber ist es ein bisschen zu übertrieben und aufgebläht? Sollte ich so viele Überprüfungen machen?

Wenn ich nicht so viele Prüfungen machen sollte, wo ziehst du die Grenze zwischen dem, was du nicht überprüfen solltest?

+0

Sie haben einen Syntaxfehler in Ihrem Code, öffnen Sie Ihre 'iset (' aber nicht schließen. – MMM

+2

Hängt. Was sind alle möglichen Rückgabewerte für 'fetchCar()'? Nehmen Sie dies in Betracht und die Prüfungen Sie müssen sicherstellen, dass Ihr Skript ohne Fehler ausgeführt wird. –

+0

@MMM Danke, ich habe diese geändert – Pattle

Antwort

4

Dies ist das Dilemma einer dynamischen Sprache. Es hängt stark von der Funktion fetchCar() ab.

Der Ansatz, den ich annehmen würde, ist anzunehmen, dass fetchCar ein Auto-Array zurückgibt oder eine Ausnahme auslöst. Wenn Sie dies mit einer guten Ausnahmebehandlungslogik kombinieren, können Sie sauberen und stabilen Code erhalten.

Zum Beispiel:

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

Auch wenn Sie dieses super-richtigen tun mögen und gehen voll OOP, Auto sollte eine Klasse mit Marke, Modell und Jahr als Mitglieder wird. fetchCar() würde Auto zurückgeben oder Exception werfen. Aber das ist natürlich nicht immer wünschenswert.

0

Ich mache alles lieber zu einer Funktion, die für diese Fälle wiederverwendet werden kann.

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

nicht alles muss Zeichenfolge sein – kajacx

+0

Notiert und eingestellt. –

+0

smart.aber beachte, wie super-langsam es funktionieren wird. – fsw

0

Ein Problem, das einige Leute nicht bemerkt haben. Seien Sie vorsichtig bei Verwendung 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.

Vergleichen Sie dies mit:

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

Sie müssen prüfen, ob $var ist ein Array, wie es zu unerwarteten Ergebnissen führen könnten. isset($var['something']) gibt im ersten Beispiel "true" zurück.

Um Ihre Frage zu beantworten, glaube ich nicht, dass dies zu viele Überprüfungen sind. Es hängt wirklich davon ab, was fetchCar() tut und wie es die Daten bekommt. Wenn Sie ihm nicht vertrauen können (z. B. basierend auf Benutzerdaten), sollten Sie alle diese Prüfungen durchführen. Wenn nicht, dann hat das keinen Sinn.

Verwandte Themen