2010-05-07 14 views
10

ho lavorato su PHP per qualche tempo, ma oggi quando ho visto questo è venuto come nuovo per me:sintassi PHP Strano

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

endif; 

Con mia grande sorpresa funziona anche senza errori. Qualcuno può illuminarmi?

Grazie a tutti :)

+5

come indicato nelle risposte di seguito, questa è una sintassi alternativa. È anche doloroso leggere l'IMO, per favore evita questo nel tuo codice. – nickf

+3

questo tipo di sintassi viene utilizzato nei modelli quando si apre e si chiude spesso e si utilizza in html. È orribile e illeggibile anche in quei casi e dovrebbe essere evitato del tutto. –

+1

@ Looris, non sono d'accordo con te.Usarlo nei tuoi modelli può migliorare la leggibilità se me lo chiedi: vedi http://stackoverflow.com/questions/2788891/strange-php-syntax/2789008#2789008 per un esempio. –

risposta

14

Quello stile di sintassi è più comunemente usato quando si incorpora in HTML, specialmente per la logica template/display. Se incorporato in questo modo, è leggermente più semplice da leggere rispetto alla sintassi delle parentesi graffe.

<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> 
<? } ?> 

I tag finali dettagliati rendono un po 'più facile per tenere traccia dei blocchi di codice nidificati, anche se è ancora in gran parte la preferenza personale.

28

Questa è PHP di Alternative syntax for control structures.

tuo frammento è equivalente a:

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

In generale:

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

è lo stesso come

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

Ti credo ... ma perché nel buon nome di Satana vorresti farlo? – BIBD

+2

@CodeSlave: Suppongo che sia più bello se si incorpora il codice html. – Daniel

1

Si può leggere a riguardo nel Alternative syntax for control structures nel manuale PHP. Riformattato, il codice che hai postato è simile al seguente:

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

Questo codice è equivalente a:

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

Questa sintassi è disponibile per diverse altre strutture di controllo pure.

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

è l'equivalente di:

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

che è equivalente a:

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

La saggezza di sostenere sintassi condizionale non standard è ovviamente discutibile.

+0

Questa sintassi può essere molto utile nei modelli, quindi ihmo non è discutibile. O almeno non ovviamente;) –