2009-05-18 152 views
2

我要修改一個大的PHP應用程序的某些部分。當然,不同的部分是由不同的人(主要是實習生)編寫的。通過閱讀代碼後,我發現,有2款編碼中使用的其他開發人員的:PHP邏輯編碼風格

  • 的「PHP是互聯網的膠水」的風格,混合HTML和PHP,例:

[剪斷]

<tr class="ds_subsubhead_2"> 
<td colspan="21" align="left">&nbsp;A&nbsp;<select name="nb_linge" onChange="MM_jumpMenu('parent',this,0)" style="vertical-align:middle">  <option value="<?=get('index.php',$orgurl,'nb_ligne=','22','23','9999') ?>" <? if($messagesParPage == '9999') { ?>selected="selected"<? } ?>>Tous</option> 
    <option value="<?=get('index.php',$orgurl,'nb_ligne=','22','23','25') ?>" <? if($messagesParPage =='25') { ?>selected="selected"<? } ?>>25</option> 
    <option value="<?=get('index.php',$orgurl,'nb_ligne=','22','23','50') ?>" <? if($messagesParPage =='50') { ?>selected="selected"<? } ?>>50</option> 
    <option value="<?=get('index.php',$orgurl,'nb_ligne=','22','23','75') ?>" <? if($messagesParPage =='75') { ?>selected="selected"<? } ?>>75</option> 

[剪斷]或

<td <? if((isset($_GET['t1']))&&($_GET['t2']!='ALL')) { ?>bgcolor="#0099FF"<? } ?>></td> 
<td <? if((isset($_GET['t3']))&&($_GET['t4']!='ALL')) { ?>bgcolor="#0099FF"<? } ?>></td> 
<td <? if((isset($_GET['t5']))&&($_GET['t6']!='ALL')) { ?>bgcolor="#0099FF"<? } ?>></td> 

[剪斷]甚至

<script type="text/javascript" src="<?=$_SESSION["path"]?>lib/js/ajax.js"></script> 

[剪斷]

  • ...和多個程序的方式,例:

[剪斷]

​​現在

,我不能完全肯定這是一個程序的方式來做事,但至少它是從以前的一個不同。哪一個,你認爲是一般更好?

我個人而言,dont't般的風格「互聯網的膠水」。

+8

聖麪條蝙蝠俠! – 2009-05-18 09:59:09

回答

3

還有第三種選擇:模板。模板比膠水或ascii嘔吐物的隨機發射更可讀。我只是傾向於使用HEREDOCd字符串和str_replace,因此:

$template = <<<TEMPLATE 
<html> 
<head> 
<title>{TITLE}</title> 
</head> 
<body> 
<div id='nav'>{NAV}</div> 
<div id='content'>{CONTENT}</div> 
</body> 
TEMPLATE; 

$data = array (
"{TITLE}" => "Page title example", 
"{NAV}" => buildNav(), 
"{CONTENT}" => buildContent()); 

str_replace(array_keys($data),array_values($data), $template); 
0

我個人的CMS有較新版本的工作,和我有一個非常困難的時間閱讀它。

2ndly,視野範圍內的模型/控制器代碼是一個偉大的意大利菜。

5

我會溝都和代碼的PHP遠離任何表現層的特定HTML。否則,事情就變得非常討厭,非常快,任何超過的「Hello World」 :)

你是搬起石頭砸自己的腳,如果你想以後修改代碼更大。我會嘗試通過移植到適當的CMS/Abstract演示文稿來消除此問題。

也不好看。我不想維護任何一種風格的代碼。 現在花時間節省時間正確清理它。

即使是一些基本的移動你的HTML到外部加載的格式字符串,並通過sprintf的運行它們()或類似的可能比目前的情況更好。你說你有這些編碼風格的混合!!!

祝你好運先生!

兩種風格應該退居動態互聯網成長的煩惱墓。通過一些開放源碼的PHP項目來看看一個好的,可維護的編碼風格。諸如http://sourceforge.net/projects/wikipedia MediaWiki展示了HTML-In-Source和分離(儘管它不是完美的IMHO)的好混合

+0

ofc清理所有這些將是一個絕對的痛苦,並需要很長的時間!有時,它是* *只是爲了更好地生活與你有什麼,直到下一次重建,從劃痕:) – sanbikinoraion 2009-05-18 10:04:19

+1

從頭開始重建反正可能會更好。問題是,我從該代碼的狀態推測,沒有適當的文檔存在!因此,重建可能需要查看原始代碼,這會給任何人頭痛和大腦模糊。 – 2009-05-18 10:07:09

2

我傾向於在中間的東西。如果我打電話十五種不同的功能,以產生選擇<option>,爲什麼不只是有一個功能,做一切,並創建完整的標記?

像這樣的東西(完全由爲例):

<select> 
<?php 
    foreach (database_query() as $row) 
     echo gen_select($row) 
?> 
</select> 

和其他地方

function gen_select($row) { 
    // do something horrifically complicated with the data (creating some variables to make the output easier to follow 

    return "<option class=\"$class\">$text</option>"; 
} 
-1

我想HTML和PHP應當分開儘可能多地。它使整個代碼更易於閱讀並創建一個清晰的結構。這意味着對我說,PHP不應該輸出HTML,因爲你可以使用HTML做的那部分......

所以我也喜歡最後一個例子,但有一個區別:我認爲使用托架式混合轉化爲HTML使得閱讀代碼非常困難。 if...endif風格是我認爲更好的選擇。用PHP打印HTML似乎也是不合邏輯的。

我會做這種方式:

<td valign="top"><form name="form5" method="GET" action=""><select name="m" onchange="this.form.submit()">; 
<? if (empty($_GET['p'])): ?> 
    <option value=" ">All</option> 
<? else: ?> 
    <option value="<?=$_GET['m']?>"><?=$_GET['m']?</option> 
<? endif; ?> 
<? 
$query = "SELECT DISTINCT maoie FROM ".$BD."site"; 
$res = mysql_query($query); 
while ($row = mysql_fetch_assoc($res)): 
?> 
    <? if(!empty($row['maoie'])): ?> 
     <option value="<?=$row['maoie']?>"><?=$row['maoie']?></option> 
    <? endif; ?> 
<? endwhile; ?> 
</select></form></td> 
<? echo add_more_stuff(); ?> 

至少這是一個比較的邏輯。儘管如此,諸如數據庫交互之類的東西應該排除在Web應用程序的其他地方。如果你將數據和頁面設計分開,它會變得更加清晰。

儘管如此,只要你只使用一些替換變量和簡單的if語句,我認爲使用PHP作爲模板語言是完全正常的。

0

兩者都是可怕的(這是PHP的在我看來,真正的弱點),但至少第一看起來可讀。
問題最終會再出現的條件(是請求POST?是數據有效?)加入,它將不可避免地導致可怕的第二種編碼。嘗試解耦視圖和邏輯:str_replacing要比連接一個gazillion小塊創建一個字符串更好。

0

沒有違法,但兩者在風格上與後期'90 -s。

你應該認真考慮重構的系統和使用模板引擎至少PHP和HTML代碼中分離。 如果您可以分離「業務邏輯」和「顯示邏輯」部分,則更好。