2009-08-19 9 views
3

Wird diese Art von Sache in PHP als OK angesehen?PHP Conditional Operator und Self Assignment

$foo = $_GET['foo']; 
$foo = empty($foo) || !custom_is_valid($foo) ? 'default' : $foo; 

Gibt es sauberere Alternativen? Ich versuche grundsätzlich, zusätzliche Nachschlagetabellen zu vermeiden.

Antwort

2

Wie Sie sehen werden, wenn Sie error_reporting(E_ALL) einschalten, ist das nicht wirklich der beste Weg, es zu tun. PHP will im Grunde Sie

$foo = empty($_GET['foo']) || !custom_is_valid($_GET['foo']) ? 'default' : $_GET['foo']; 
+0

Gibt die PHP-Spezifikation irgendwelche Leistungsgarantien für Tabellennachschlage? –

+3

Ich kann mir nicht vorstellen, was Sie denken lässt, dass es eine PHP-Spezifikation gibt. :/ – chaos

+0

Ich habe keine Ahnung. ;) Ich habe einen C++ Hintergrund und ich habe vor ein paar Stunden mit PHP angefangen. –

3

Sucht custom_is_valid() nach einer leeren Variablen? Da es in der Lage ist, das leere() und "oder nicht" zu entfernen, würde es einen langen Weg zur Verbesserung dieses Codes geben.

+0

Es wird immer noch eine Warnung ausgeben, wenn '$ _GET ['foo']' nicht da ist. – chaos

+0

nur verwenden: "$ foo = custom_is_valid ($ _ GET ['foot']);", und in custom_is_valid (..) Daten überprüfen, ¿ok? –

0

tun, wie etwa:

$foo = 'default'; 
if (array_key_exists('foo', $_GET) and custom_is_valid($_GET['foo'])) { 
    $foo = $_GET['foo']; 
} 

Und keine Angst, der Array-Lookups, sie sind nicht so langsam :)

0

Vielleicht statt nur Kontrolle Wenn es gültig ist, führen Sie es durch eine Reinigungsfunktion aus, die einen Standardwert übernimmt.

Auch Ich mag die folgende Funktion verwenden, so dass ich auf den Zugriff auf nicht-existente Array-Schlüssel nicht Warnungen erhalten, wenn E_STRICT ausgeführt wird:

function GetVar($var, $default = '') { 
    $value = $default; 
    if(isset($_GET[$var])) { 
    $value = $_GET[$var]; 
    } 
    return $value; 
} 

function custom_clean($value, $default = '') { 
    ... validation logic or return $default ... 
} 

$foo = custom_clean(GetVar('foo'), 'default'); 
0

Eine Klasse hier würde Ihr Leben viel einfacher machen.

<?php 

class ParamHelper 
{ 
    protected $source; 

    public function __construct(array $source) 
    { 
    $this->source = $source; 
    } 

    public function get($key, $default=null, $validationCallback=null) 
    { 
    if (isset($this->source[$key]) && !empty($this->source[$key])) 
    { 
     if (is_null($validationCallback) || (!is_null($validationCallback) && call_user_func($validationCallback, $this->source[$key]))) 
     { 
     return $this->source[$key]; 
     } 
    } 
    return $default; 
    } 
} 

// Just for the demo 
function validateUpper($value) 
{ 
    return ($value == strtoupper($value)); 
} 

// Mimic some query-string values 
$_GET['foo'] = 'bar'; 
$_GET['bar'] = 'BAZ'; 
$_GET['lol'] = 'el oh el'; 

$getHelper = new ParamHelper($_GET); 

echo $getHelper->get('foo', 'foo default', 'validateUpper'), '<br>'; 
echo $getHelper->get('bar', 'bar default', 'validateUpper'), '<br>'; 
echo $getHelper->get('baz', 'baz default'), '<br>'; 
echo $getHelper->get('lol'), '<br>'; 
echo $getHelper->get('rofl'), '<br>';