我必须修改大型PHP应用程序的某些部分。当然,不同的部分是由不同的人(主要是实习生)编写的。在查看代码之后,我发现其他开发人员使用了两种编码样式:
[剪断]
<tr class="ds_subsubhead_2">
<td colspan="21" align="left"> A <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>
[snip]或
<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>
[snip]甚至
<script type="text/javascript" src="<?=$_SESSION["path"]?>lib/js/ajax.js"></script>
[剪断]
[剪断]
$output .= '<td valign="top"><form name="form5" method="GET" action=""><select name="m" onchange="this.form.submit()">';
if ( empty($_GET['p']) ) $output .= '<option value=" ">All</option>';
else $output .= '<option value='.$_GET['m'].'>'.$_GET['m'].'</option>';
$query = "SELECT DISTINCT maoie FROM ".$BD."site";
$res = mysql_query($query);
while ( $row = mysql_fetch_assoc($res) ) {
if( !empty($row['maoie']) ) $output .= '<option value="'.$row['maoie'].'">'.$row['maoie'].'</option>';
}
$output .= '</select></form></td>';
$output .= add_more_stuff();
echo $output;
现在,我并不完全确定这是一种更多程序性方法,但至少它与前一种不同。您认为哪一个通常更好?
我个人而言,不喜欢'互联网'风格的胶水。
答案 0 :(得分:5)
我会抛弃两者并将PHP编码远离任何特定于表示层的HTML。否则,对于比“Hello World”更大的东西,事情变得非常讨厌:)
如果您想稍后修改代码,那么您就是在脚下拍摄。我会尝试通过移植到正确的CMS /抽象演示文稿来解决这个问题。
两者看起来都不错。我不想在任何一种风格中维护代码。 现在花些时间来节省时间正确清理它。
即使是将HTML移动到外部加载的格式字符串并通过sprintf()或类似字符串运行它们的基本操作也可能比当前情况更好。而且你说你有这些编码风格的混合!?!
先生,祝你好运!
这两种风格应该降级为动态互联网成长之痛的坟墓。看一下开源PHP项目,看看一个好的,可维护的编码风格。像http://sourceforge.net/projects/wikipedia MediaWiki这样的东西展示了HTML-In-Source和分离的良好组合(尽管它不是完美的恕我直言)
答案 1 :(得分: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);
答案 2 :(得分:2)
我倾向于在中间寻找一些东西。如果我调用十五个不同的函数来生成一个select <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>";
}
答案 3 :(得分:0)
我个人在拥有后一版本的CMS上工作,我很难阅读它。
2,视图中的模型/控制器代码是一道很棒的意大利菜。
答案 4 :(得分:0)
两者都很可怕(我认为这是PHP的真正弱点),但至少第一个看起来可读。
一旦条件(请求POST?是数据有效吗?)被添加,最终会出现问题,并且它将总是导致可怕的第二种编码。尝试解耦视图和逻辑:str_replacing比通过连接一个巨大的小块来构建字符串更好。
答案 5 :(得分:0)
没有冒犯,但这两种风格都是从90年代后期开始的。
您应该认真考虑重构系统并使用模板引擎至少分离PHP和HTML代码。 如果你可以将“业务逻辑”和“显示逻辑”部分分开,那就更好了。
答案 6 :(得分:-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作为模板语言是完全没问题的。