2009-05-18 124 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代码中分离。 如果您可以分离“业务逻辑”和“显示逻辑”部分,则更好。