2012-11-22 8 views
5

Seit PHP 5.3 ist es möglich, den mittleren Teil des ternären Operators wegzulassen. Ausdruck expr1?: Expr3 gibt expr1 zurück, wenn expr1 TRUE ergibt und andernfalls expr3.Eine prägnantere Möglichkeit zum Festlegen von Standardwerten?

Gibt es einen besseren oder prägnanteren Weg als den folgenden Code, um den Standardwert der Variablen festzulegen?

$v = isset($v) ? $v : "default value"; 

Antwort

2

Hier ist eine kürzere Syntax:

isset($v) || $v="default value"; 
0

Nein. Das ist der richtige Weg, wenn Sie nicht wirklich wissen, ob $v eingestellt ist.

0

Kein Weg. Wenn Sie ternären Operator verwenden.

6

TL; DR - Nein, dieser Ausdruck kann nicht kürzer gemacht werden.

Was Sie wollen, ist für den verkürzten ternären Ausdruck eine implizite isset() durchzuführen. Dies wurde auf der mailing list diskutiert und eine ifsetor RFC wurde erstellt, die das Konzept ebenso abdeckt.

Da der verkürzte ternäre Operator bereits zum Zeitpunkt der oben genannten Diskussion gab, war so etwas wie diese proposed einen nicht existierenden Betreiber ?? mit:

// PROPOSAL ONLY, DOES NOT WORK 
$v = $v ?? 'default value'; 

Assign 'default value' wenn $v nicht definiert ist.

Nichts wurde jedoch bisher in der Hauptsprache implementiert. Bis dahin kann das, was Sie geschrieben haben, nicht kürzer sein.

Dieses schrecklich Konstrukt ist kürzer, aber beachten Sie, dass es nicht die gleiche weil es den Standardwert zuweist, wenn die Variable existiert, aber ausgewertet false:

// DO NOT USE 
$v = @$v ?: 'default value'; 
+1

Was passiert, wenn '$ v' bereits gesetzt ist, und es ist' ‚‘ ' oder "0" oder "null" oder "falsch"? – Carlos

+1

Ich verstehe. Aber ich denke nicht, dass es ein guter Ansatz ist ... – Carlos

+1

@jackflash Daher meine Erwähnung von "schrecklichen Konstrukt" –

2

Gerade this gefragt und wurde an dieser Stelle darauf . So im Fall, dass Sie ein key ein array, könnte dies eine Verbesserung

function isset_get($array, $key, $default = null) { 
    return isset($array[$key]) ? $array[$key] : $default; 
}