2010-09-17 8 views
17

In sostanza, mi piacerebbe essere in grado di definire una variabile come una cosa, a meno che quella cosa non esista. Giuro che da qualche parte ho visto una condizionale abbreviata che sembrava qualcosa di simile:Stenografia condizionale per definire una variabile in base all'esistenza di un'altra variabile in PHP

$var=$_GET["var"] || "default"; 

Ma non riesco a trovare alcuna documentazione a fare questo diritto, e onestamente si sarebbe potuto JS o ASP o qualcosa in cui l'ho visto .

Capisco che tutto ciò che dovrebbe accadere nel codice sopra è solo per verificare se entrambe le dichiarazioni restituisce true. Ma pensavo di aver visto qualcuno fare qualcosa che essenzialmente definiva un default se il primo falliva. È qualcosa che qualcuno conosce e può aiutarmi? Sono pazzo? Sembra proprio superfluo dire:

$var=($_GET["var"]) ? $_GET["var"] : "default"; 

o particolarmente ridondante dire:

if ($_GET["var"]) { $var=$_GET["var"]; } else { $var="default"; } 

Pensieri?

+0

Sì è stupido php non può farlo, qualcuno sa se può farlo a partire da 5.6? –

+1

@DominicTobias La risposta accettata funziona in 5.3+ –

+0

Possibile duplicato di [Impostazione dei valori predefiniti (assegnazione condizionale)] (http://stackoverflow.com/questions/163092/setting-default-values-conditional-assignment) –

risposta

14

Matthew ha già menzionato l'unico modo per farlo in PHP 5.3. Si noti che è anche possibile concatenare:

$a = false ?: false ?: 'A'; // 'A' 

Questo non è lo stesso di:

$a = false || false || 'A'; // true 

Il motivo è che PHP è come la maggior parte delle lingue tradizionali in questo aspetto. L'OR logico restituisce sempre true o false. Tuttavia, in JavaScript, viene utilizzata l'espressione finale. (In una serie di OR, sarà la prima non falsa.)

var a = false || 'A' || false; // 'A' 
var b = true && 'A' && 'B'; // 'B'; 
+0

Altro Matthew ha rimosso la sua risposta perché non gli piaceva che la risposta non seguisse le sue migliori pratiche personali, quindi l'ha rimosso. Pertanto sto contrassegnando questo come corretto perché si espande sulla risposta originale. Per la cronaca, le altre preoccupazioni di Matthew sono espresse nella risposta di Fanis. Sono preoccupazioni valide, ma la risposta alla mia domanda è in effetti '?:', Come mostrato qui. –

7

In questi casi è necessario verificare l'esistenza della variabile in $ _GET e quindi se è valida per i parametri. Ad esempio:

$var = (isset($_GET["var"]) && $_GET['var'] !== '') ? $_GET["var"] : "default"; 

Tuttavia, questo può diventare piuttosto illeggibile abbastanza rapidamente. Direi mantenerlo leggibile dal primo inizializzare la variabile di un default di sicurezza, e quindi sovrascrivere quello con uno esterno, se è valida:

$var = "default"; 
if (isset($_GET['var') && $_GET['var'] !== '') { 
    $var = $_GET['var] ; 
} 

quanto riguarda il tuo primo esempio, $var=$_GET["var"] || "default"; esiste in Javascript: var someVar = incomingVar || "default";

+0

@ Ben, questa dovrebbe essere la risposta accettata. È un po 'più lungo, ma evita gli avvertimenti. Inoltre, il controllo contro! == '' non riguarda l'esistenza, anche se può essere utile in certi casi. –

+0

@MatthewFlaschen Questo in realtà non risponde alla domanda che avevo però. Solleva preoccupazioni valide, quindi l'ho svalutato. Ma la domanda era se ci fosse un modo per realizzare ciò che hai fatto, stenografia. –

2

Ho sempre usato vuoto.

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

Suppongo che se stai usando $ _GET, non otterrai mai una risposta booleana così 'empty' è indistinguibile da 'isset', ma questo sembra un modo peggiore di farlo in altre situazioni:' $ var =! Empty ($ other_var)? $ other_var: true' renderà $ var * always * uguale true. Sebbene, suppongo, anche la notazione JS 'var = other_var || true'. –

Problemi correlati