PHP逻辑编码风格

时间:2009-05-18 09:54:45

标签: php

我必须修改大型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>

[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;

现在,我并不完全确定这是一种更多程序性方法,但至少它与前一种不同。您认为哪一个通常更好?

我个人而言,不喜欢'互联网'风格的胶水。

7 个答案:

答案 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作为模板语言是完全没问题的。