2010-05-07 15 views
10

Ich habe seit einiger Zeit auf PHP gearbeitet, aber heute, als ich das sah, kam es mir vor, als neu:Seltsame PHP-Syntax

if(preg_match('/foo.*bar/','foo is a bar')): 
     echo 'success '; 
     echo 'foo comes before bar'; 

endif; 

Zu meiner Überraschung ohne Fehler läuft es auch. Kann mich jemand aufklären?

Danke an alle :)

+5

wie die Antworten unten gesagt haben, ist dies eine alternative Syntax. Es ist auch furchtbar schmerzhaft, IMO zu lesen, bitte vermeide dies in deinem eigenen Code. – nickf

+3

Diese Art von Syntax wird in Vorlagen verwendet, wenn Sie oft öffnen und schließen und Sie verwenden HTML dazwischen. Es ist schrecklich und unlesbar auch in diesen Fällen und sollte ganz vermieden werden. –

+1

@ Lo'oris, ich stimme dir nicht zu.Die Verwendung in Ihren Vorlagen kann die Lesbarkeit verbessern, wenn Sie mich fragen: siehe http://stackoverflow.com/questions/2788891/strange-php-syntax/2789008#2789008 für ein Beispiel. –

Antwort

14

Dieser Stil der Syntax wird häufiger beim Einbetten in HTML verwendet, insbesondere für Vorlagen-/Anzeigelogik. Wenn es auf diese Weise eingebettet ist, ist es etwas einfacher zu lesen als die Syntax der geschweiften Klammern.

<div> 
<? if ($condition): ?> 
    <ul> 
    <? foreach($foo as $bar): ?> 
     <li><?= $bar ?></li> 
    <? endforeach ?> 
    </ul> 
<? endif ?> 
</div> 

Versus:

<div> 
<? if ($condition) { ?> 
    <ul> 
    <? foreach($foo as $bar) { ?> 
     <li><?= $bar ?></li> 
    <? } ?> 
    </ul> 
<? } ?> 

Die ausführlichen End-Tags machen es ein wenig einfacher, den Überblick von verschachtelten Codeblöcken zu halten, obwohl es nach wie vor meist persönliche Präferenz ist.

28

Dies ist PHP Alternative syntax for control structures.

Ihr Snippet entspricht:

if(preg_match('/foo.*bar/','foo is a bar')) { 
     echo 'success '; 
     echo 'foo comes before bar'; 
} 

Allgemein gilt:

if(cond): 
... 
... 
endif; 

ist die gleiche wie

if(cond) { 
... 
... 
} 
+1

Ich glaube dir ... aber warum in Satans gutem Namen würdest du das tun wollen? – BIBD

+2

@CodeSlave: Ich denke, es sieht besser aus, wenn Sie HTML-Code einbetten. – Daniel

1

Sie können darüber in Alternative syntax for control structures im PHP-Handbuch lesen. Umformatiert, sieht der Code, den Sie wie folgt geschrieben:

if (preg_match('/foo.*bar/','foo is a bar')): 
    echo 'success '; 
    echo 'foo comes before bar'; 
endif; 

Dieser Code entspricht:

if (preg_match('/foo.*bar/','foo is a bar')) { 
    echo 'success '; 
    echo 'foo comes before bar'; 
} 

Diese Syntax für mehrere andere Kontrollstrukturen als auch zur Verfügung steht.

if (condition): 
    // your if code 
elseif (other_condition): 
    // optional elseif code 
else: 
    // optional else code 
endif; 

while (condition): 
    // your while code 
endwhile; 

for (condition): 
    // your for code 
endfor; 

foreach (condition): 
    // your foreach code 
endforeach; 

switch (condition): 
    // your switch code 
endswitch; 
0

Es ist das Äquivalent von:

if(preg_match('/foo.*bar/','foo is a bar')): 
echo 'success '; 
echo 'foo comes before bar'; 
endif; 

, die gleich ist:

if(preg_match('/foo.*bar/','foo is a bar')){ 
    echo 'success '; 
    echo 'foo comes before bar'; 
} 

Die Weisheit Nicht-Standard-bedingte Syntax unterstützt offensichtlich fragwürdig ist.

+0

Diese Syntax kann in Vorlagen sehr nützlich sein, daher ist sie nicht fraglich. Oder zumindest nicht offensichtlich;) –