2012-04-09 14 views
2

Gibt es eine Möglichkeit, die folgenden zu tun, aber in kurzer if/then Syntax:PHP Stenografie Wenn Else

if($method->isAbstract()) { 
    $details['abstract'] = true; 
} 

Wenn ich tue:

$details['abstract'] = $method->isAbstract() ? true : null; 

Es ist nicht ganz dasselbe, weil Der Array-Schlüssel abstract wird immer gesetzt. Ich habe nur den Array-Schlüssel gesetzt, wenn isAbstract() wahr ist. Um zu klären, ob isAbstract() false ist, setze den Schlüssel nicht im Array.

Danke.

+0

Wenn '$ method-> isAbstract()' false ist, wird der Array-Schlüssel 'abstract' definiert. Ich möchte nicht, dass das Element im Array existiert, wenn es falsch ist. – Justin

+1

Ternärer Operator ** IST NICHT ** eine Kurzschrift zu 'if-else'. Fragte, wer es so gesagt hat, dass so viele Leute so denken ?! – zerkms

+0

Was ist los mit dem ersten Code? Arent 3 Zeilen kurz genug? Sie können es kürzer schreiben wie 'if ($ method-> isAbstract()) $ details ['abstract'] = true;'. Interessanter: Warum sollte der Schlüssel komplett fehlen? Warum nicht "falsch"? Fühlt sich konsistenter an und es ist nur ein völlig offensichtliches '$ details ['abstract'] = $ method-> isAbstract()' – KingCrunch

Antwort

4

Ich habe auf der Hand kein PHP-Interpreter, aber ich denke, das wird funktionieren:

$method->isAbstract() && $details['abstract'] = true; 

Update: ja, es funktioniert → http://codepad.org/lW23FR0j

+9

Ist es ein Wettbewerb, wie man den am schwierigsten zu verstehenden Code schreibt? – zerkms

+2

Sicher, es funktioniert, aber ich würde diese Art der Nutzung entmutigen, es ist weniger klar als die if-else-Version und schwer zu pflegen – nico

+0

Ich mag es. Vielen Dank. – Justin

2

mich nicht zu viel zu versuchen, kümmern würde drei Zeilen Code zu verkürzen, die in aller Ehrlichkeit in einer Zeile sowieso geschrieben werden könnte:

if ($obj->method()) $data['key'] = 'value' ; 

jedoch als @Mischa's answer gezeigt, gibt es kürzere Wege. Sie könnten den logischen Operator && verwenden Zuordnung auszuführen, wie gut:

$obj->method() && $data['key'] = 'value' ; 

Bei diesem Verfahren wird der Ausdruck auf der rechten Seite ausgewertet wird, wenn der Ausdruck auf der linken Seite ist „true“.

Eine andere Methode ist der neue kürzere ternäre Operator, der den zweiten Ausdruck ausschließt. Während Sie die Langform ternären als Alternative in Ihrer ursprünglichen Frage präsentiert, können Sie auch das neue Format seit PHP 5,3

!$obj->method() ?: $data['key'] = 'value' ; 

bereitgestellt betrachten Da wir nicht den zweiten Ausdruck verwenden, kehren wir unser Test in der erster Ausdruck. Wir suchen nicht mehr nach einem positiven, sondern nach einem negativen. Wenn das Negativ gefunden wird, findet unsere Aufgabe statt.

Ich biete diese Antwort nicht an, um Sie zu ermutigen, 3-Linien-Lösungen zu vermeiden, aber nur um Sie zu ermutigen, von Zeit zu Zeit kürzere Lösungen zu erkunden, da sie oft zu Teilen der Sprache führen, die Sie nicht mögen habe es sonst entdeckt.