2010-05-07 296 views
10

我已經工作PHP一段時間,但今天,當我看到這一點,來到新的對我說:奇怪的PHP語法

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

endif; 

令我吃驚的它也運行沒有錯誤。任何人都可以啓發我嗎?

感謝所有:)

+5

正如下面的答案所說,這是一種替代語法。閱讀海事組織也非常痛苦,請在自己的代碼中避免這種情況。 – nickf 2010-05-07 13:36:46

+3

當您經常打開和關閉並在兩者之間使用html時,此類語法在模板中使用。即使在這些情況下,它是可怕的和不可讀的,應該完全避免。 – 2010-05-07 13:48:18

+1

@ Lo'oris,我不同意你的看法。如果你問我,在模板中使用它可以提高可讀性:有關示例,請參閱http://stackoverflow.com/questions/2788891/strange-php-syntax/2789008#2789008。 – 2010-05-07 13:50:42

回答

14

當嵌入到HTML中時,這種語法風格更常用,特別是對於模板/顯示邏輯。當以這種方式嵌入時,比花括號語法更容易閱讀。

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

對戰:

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

的冗長的結束標記,使其更容易一些跟蹤嵌套的代碼塊,但它仍然主要是個人喜好。

28

這是PHP的Alternative syntax for control structures

您的片段等同於:

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

一般:

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

是相同

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

我相信你......但爲什麼你要這麼做呢? – BIBD 2010-05-07 14:32:37

+2

@CodeSlave:我想如果你在嵌入html代碼,它看起來更好。 – Daniel 2010-05-07 15:06:55

1

您可以在PHP手冊中的Alternative syntax for control structures中閱讀。重新格式化,您發佈的代碼如下所示:

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

此代碼等同於:

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

這句法可用於其它一些控制結構爲好。

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

這是等價的:

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

這相當於:

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

的支持非標準條件語法的智慧顯然是有問題的。

+0

此語法在模板中可能非常有用,因此ihmo不會有問題。或者至少不明顯;) – 2010-05-07 13:48:02