+ -
当前位置:首页 → 问答吧 → 第8章 PHP开发规范

第8章 PHP开发规范

时间:2007-10-26

来源:互联网

常言道,“没有规矩不成方圆”,良好的编程风格与规范对于开发者以及项目管理者是非常重要的。笔者曾经参与过一个旧项目的二次开发与原功能维护,非常糟糕的是,原有的代码杂乱无章,有的程序甚至连注释都没有,而且设计文档残缺不全,这对维护的人简直是个噩梦。



8.1代码结构


在本节,我们讨论一些关于在Web应用程序中组织代码的方法。

8.1.1一个脚本服务全部


一个脚本服务全部,指的是由一个文件负责接收所有的URL请求以及根据不同的请求显示不同的页面逻辑。
实现的原理是,使用不同的参数给一个脚本程序,比如这个脚本名称叫做index.php,我们规定脚本可以从URL(浏览器地址栏)上接收 GET参数,比如:index.php?action=register。
并不是说把所有的代码都放在这个index.php里,而是根据不同的参数,用include或require语句,将相应的外部代码或函数引入进来。
请见如下的脚本实例:
复制PHP内容到剪贴板
PHP代码:

<?php
   //包含公共的头文件
   include_once('header.php');
   //取得GET变量$action的值
   $page = $_GET['action'];
   //根据$action的不同值做分发处理
   switch($page) {
   case "home": 
      $c;
      break;
   case "about":
      $c;
      break;
   case "product":
      $c;
      break;
   default: 
      $c; 
      break;
   }
   //开始包含相关的文件,显示出来
   include_once($content):
   //包含公共的版权信息文件
   include_once('footer.php');
?>

该脚本的处理流程如图8-1所示。


                图8-1

使用该脚本时,需要通过URL的GET方法进行参数传递,代码如下:
复制PHP内容到剪贴板
PHP代码:
<a href="index.php?action=about">关于我们</a>
<a href="index.php?action=product">产品中心</a>
<a href="index.php?action=contact">联系我们</a>

我们可以看到,该例使用case语句对应相应的模块(home,product,contact,about)。在这个程序里,一个指定的文件和类接受页面提交的请求。
我们可以设想,使用case后有多少不同的模块,但是当程序中有很多个模块和参数时,这个switch case语句需要做的分发处理逻辑将非常大。
为防止过多的switch使程序变得臃肿难于维护,我们可以使用如下方式,就不必使用那么多的switch语句了,代码如下:
复制PHP内容到剪贴板
PHP代码:
foreach (directory in "modules/") {//模块文件所在的目录
   if file_exists("definition.php") {//如果模块文件存在
      module_def = include "definition";//包括存在,则包含之
      register_module(module_def);
   }
}
if registered_module($_GET['module']) {
   $driver = new $_GET['module'];
   $driver->execute();
}


8.1.2分离显示逻辑

有两种步骤,我们需要分离业务逻辑与显示方式从页面中抽出。
我们可以自己编写模板方法,或使用一些模块引擎,关于分离显示与业务逻辑,请看第18章“Smarty与模板技术”。



附件: 您所在的用户组无法下载或查看附件

作者: PHPChina   发布时间: 2007-10-26

8.2良好的编码风格与样式选择
一个良好的的代码编码风格和样式,十分重要。在一个脚本以及整个项目中,如果堆积了各种风格不同的代码,一旦有工作交接,无论是新的或老的开发人员在开始会被弄得非常糊涂。

编码风格与个人的行事风格有关,开发者可能更喜欢按照自己的习惯与风格编写代码。但是在编码中有几点需要开发者注意:代码的格式、布局、隔行空白的宽度、代码中SQL语句的规范等的编写应该遵循一定的规范,这些规定虽然并非强制性的,但为了加强代码结构的逻辑性和易读性,遵循它们是非常必要的,请各位读者一定要牢记。
作为优秀的负责任的PHP开发者,在项目中从始至终都应遵守一种开发风格,并且不断完善并坚持下去,使之成为一个完美的标准。

下面讲述在PHP编码中,需要开发者注意和学习的几点。


8.2.1代码注释

以下是几种标准的PHP代码注释样式:
1.单行注释//Note
请见以下样例:
复制PHP内容到剪贴板
PHP代码:

<?php
   // Title: My PHP program
   // Author: Jason
   print "This is a simple PHP program";
?>

2.Perl样式的单行注释# this is comment
请见以下样例:
复制PHP内容到剪贴板
PHP代码:

<?php
   # Title: My First PHP Script
   # Author: Jason
   print "This is a PHP program";
?>

3.Java/C++样式注释
/**
* Local variables
* tab-width:2
*
*/
请见以下样例:
复制PHP内容到剪贴板
PHP代码:

<?php
  /*
   * Title: My PHP Program
   * Author: Jason
    * Date: May 10, 2006
   */
   print "This is a PHP program";
?>


8.2.2代码缩进


代码缩进指的是,在PHP源代码中,我们使用TAB(制表键)对齐代码。比如,有一个程序的处理逻辑是根据月份返回当月的天数,原来编写的代码是这样的:
复制PHP内容到剪贴板
PHP代码:

<?php
   if($month == '12' || $month == 'setmember'|| $month == '12' || $month == 'setmember') {
   return 28;
}
?>

下面是我们重新修改了样式和风格的版本,在代码换行后使用了TAB键进行对齐:
复制PHP内容到剪贴板
PHP代码:

<?php
   if($month == '12' ||
      $month == 'setmember'||
      $month == '12' || 
      $month == 'setmember')
{
   return 28;
}
?>

在UEStudio编辑器中显示的代码样式如图8-2所示。

                       图8-2
可以看到,第二个版本的代码样式明显要清晰于第一个版本,它变得更加易读。需要注意的是,不同的编辑工具对TAB的缩进有不同的规定,这需要开发者在编辑器使用相同的字符个数缩进规定。

8.2.3使用必要的空格

为了代码的整齐,我们可以使用适当的空格来对齐代码,请见如下代码:
复制PHP内容到剪贴板
PHP代码:
$lt    = localtime();
$name  = $_GET['user_name'];
$month = $lt['tm_mon'] + 1;

另外,笔者的个人习惯是,在程序中,全部代码都从第四列开始的,即所有代码缩进了4个空格开始写,这使得代码不那么紧凑,看起来也舒服一些(如图8-1所示)。

8.2.4SQL编写规范

在程序中,编写SQL语句的规范有如下几点:
Ø大写SQL的保留字;
Ø在超长的SQL语句中,保留字的后面请适当换行;
Ø使用表格的别名(AS Alias)使SQL语句更清晰。
请见如下代码:
复制PHP内容到剪贴板
PHP代码:
$sql = "SELECT 

        account_id,
        order_total_price,
        order_cc_number,
        order_cc_exp_dt,
        order_ship_dt,
        order_pfp_confirm,
        status,
        created_dt
         FROM
            ".PREFIX."_orders
         WHERE
            order_id = '".$_REQUEST[OrderId]."'
         ";

PHP的判断是以“;”来做结束点,当PHP解析程序的时候,从一行代码的头开始,直到分号“;”才算结束,因此这种格式更清楚易读。
有的PHP程序员喜欢用.(小圆点)连接SQL,这样看来的确很美观,只不过PHP要多花一点点时间连接这些字符串,效率会有所降低。有关SQL执行效率的讨论我们会在数据库一章详细讲述。

8.2.5控制结构

围绕控制结构的写法可能是程序员们最喜欢争议的话题。关于写法主要有以下三种样式,你必须在项目中选择一个一致的写法:
1.BSD样式if($condition){
   //语句体
}
本书中的PHP代码全部采用BSD样式,一是为了保持一致,二来也节省篇幅。
2.GNU样式if($condition)
{
   //语句体
}
3.C语言样式if($condition) {
   //语句体
}

8.2.6函数的命名

在函数一节,我们介绍过函数多半是用于完成某项任务的代码段,即完成某个动作或操作,所以应该以动词作为函数名称。
比如下面的函数命名例子:
复制PHP内容到剪贴板
PHP代码:
function checkOrder($ProductId){
   echo "您选择了编号为$ProductId的商品";
}
函数的名字也可以用”_”下划线分隔,如:
function check_order($ProductId){
   echo "您选择了编号为$Productid的商品";
}

这两种命名方式都可以,根据自己的喜好,选择一种就行。
同样,函数的命名规范也适合PHP文件名的命名,比如将文件命名为:myIndex.php,orderForm.php或者my_index.php,order_form.php。

8.2.7类命名规范

类的命名规则,源自C++和Java的命名规范,这些规范也适用于PHP。PHP类的命名规则如下:
Ø类名称的第1个字符为大写:
Ø长单词的类名称需要截取,并且第1个字母必须为大写。
以下为类声明的两个例子:
class XML_RSS{}
class Text_PrettyPrinter{}
关于面向对象与类,我们在下一章会详细说明。

8.2.8减少出错的技巧

1.不使用短标识符在第1章中,我们就强调过这个问题,这里再强调一下,不要再用下面的短标识符(short_tag)编写程序:
<?=$_REQUEST['passport_name'] ";?>
从PHP5以后,php.ini文件中的short_tag选项是关闭的,因此如果使用短标识符编写程序可能导致该程序不能执行,另外,按照Web开发的行业标准,也应该采用XML标准来开发程序,使用如下语句:
复制PHP内容到剪贴板
PHP代码:

<?xml version= "1.0 " ?>
   下面的脚本是可以通行在任何PHP环境中的:
<?php
   echo $_REQUEST['passport_name'];
?>

2.减少脚本中输出HTML在PHP程序中尽可能少出现HTML代码,因为太多的HTML标签会增加维护的复杂度,含较少的HTML代码的PHP程序在改版或修改样式时会更方便。
下面的代码使用echo语句输出HTML:
复制PHP内容到剪贴板
PHP代码:

<?php
   echo "<table> ";
   echo "<tr><td>姓名</td><td>位置</td><td> ";
   foreach ($userArray as $userItem){
      echo " <tr><td>$userItem[Name]</td><td>$userItem[Position]<td></tr>";
   }
   echo " </table> ";
?>

应该使用下面优化的写法,把PHP代码嵌入到HTML中:
复制PHP内容到剪贴板
PHP代码:

<table>
   <tr><td>姓名</td><td>位置</td><td>
   <?php foreach ($userArray as $userItem){ ?>
   <tr><td><? echo $userItem[Name]; ?></td><td><? echo $userItem[Position]; ?><td></tr>
   <?php } ?>
</table>
在第9章,我们还会了解更多PHP 5程序优化的技巧。



8.3小结

PHP开发人员有时被人称为草根一族,主要因为没有一个官方的PHP开发规范。在很多现在的开发团队中,有不少人是半路出家,将开发规范根本视为不存在,因此导致代码的低效和可维护性较差。如果我们遵循了一些规范,除了代码的可维护性会提高之外,您的程序员生涯将从此迈入一个新的境界,或许将从一个小工进而成为一位开发规范、作风严谨的PHP软件开发者。
附件: 您所在的用户组无法下载或查看附件

作者: PHPChina   发布时间: 2007-10-26

感谢提供这么好的作品,辛苦了

这里还是提供一份电子版,刚做的要不好的地方提出改正,谢谢!!!:)
附件: 您所在的用户组无法下载或查看附件

作者: jfcat   发布时间: 2007-10-26

仔细看看,也是对作者的辛苦写书的尊重。

作者: zheman   发布时间: 2007-10-26

印度的IT技术之所以仅次于美国,是因为他们编写程序都是按照一定的规范来写的,在他们那里,在一个班上出同一道程序题,他们写出来的程序是一模一样的,而且简单易懂。显而易见程序规范对一个国家还是个人是多么的重要,我们写程序不是只为了自己看懂明白,而是让更多的人也能看懂,所以好的程序员都喜欢写注释!这样便于自己将来修改,也便于其他人能够清楚的看清作者的逻辑思维的!从而提高所有人技术含量。

作者: chaizhiyong   发布时间: 2007-10-26

引用:
原帖由 chaizhiyong 于 2007-10-26 14:46 发表
印度的IT技术之所以仅次于美国,是因为他们编写程序都是按照一定的规范来写的,在他们那里,在一个班上出同一道程序题,他们写出来的程序是一模一样的,而且简单易懂。显而易见程序规范对一个国家还是个人是多么 ...
提一小小看法,我认为印度人IT技术好也就只能说软件方面,在这方面他们有明显的先天优势,印度人一向的逻辑好,从古代开始就对数学方面有很高的成就。另外也是一先天优势就是语言,英语作为印度的官方语言(谈不上原本的母语),这是个很大的优势,它改变了人的思想和逻辑,这对现在软件业是很重要的

作者: jfcat   发布时间: 2007-10-26

其实代码编码规范是很重要,但一般人们编写的时候总觉得太麻烦,
虽然到下次打开的时候有些代码自己也不清楚功能了,
但还是不记得写,这不知该如何解决了

作者: jingangel   发布时间: 2007-10-29

对于现在的网络世界,本人感觉就像武侠小说中的江湖一样,而不同的开发语言就像不同的门派,而杜江的这本《PHP5与MySQL5 Web开发技术详解》就像一本至高无上的武功秘籍,要想独步江湖,神功的练就不是一日,要经过长期点滴的积累。想学PHP语言的人很多,但只要一翻此书的目录,可能就让很多人畏惧却步。对于真正要学的人,除了坚定的决心以外,良好的习惯是必不可少的,这样可以更有利于自己的提高,也有利于程序的共享和应用价值的提高,达到事半功倍的效果。

作者: b136364111   发布时间: 2007-10-29

对于规范代码而言,本人觉的这本书做的很好,代码段落语句清晰,注释详细,而且分不同颜色予以标示,很为读者考虑,这样对读者有很好的规范和参考意义,对于学习者的提高很有帮助。本人感觉对于规范代码而言,在很多语言里都有提及,除了有利于别人阅读修改外,本人感觉更是大型程序编写团队合作的需要,像编微软的WINDOWS一样,其难度并不亚于建一个三峡工程,所以,团队合作,代码的编写更加重要。

作者: b136364111   发布时间: 2007-10-29

引用:
原帖由 b136364111 于 2007-10-29 11:36 发表
对于规范代码而言,本人觉的这本书做的很好,代码段落语句清晰,注释详细,而且分不同颜色予以标示,很为读者考虑,这样对读者有很好的规范和参考意义,对于学习者的提高很有帮助。本人感觉对于规范代码而言,在 ...
这本书是作者的经验之谈,而且肯拿到论坛上来给我们评,应当是有相当准备的,我想这个规范代码已经可以作者在这本书上下的功夫,同时期待能看到更多好的章节!!!:D

作者: jfcat   发布时间: 2007-10-29

顶顶哈

作者: zwws   发布时间: 2007-10-30

看见作者的那辆座骑,的确不错啊,看来学PHP还是很有前途的 呵呵   说点题外话

作者: b136364111   发布时间: 2007-10-30



不错啊 一辆好车  不知什么牌子
附件: 您所在的用户组无法下载或查看附件

作者: b136364111   发布时间: 2007-10-30

作者可是很全面的,可不光PHP这两下子,至少能自己出书的可就不简单哦

作者: jfcat   发布时间: 2007-10-31

很多内容看来的确是作者的切身体会,开发规范这东西,没经过大量代码的浸淫,是很难意识到其重要性的。
像SQL编写规范,最近在改些程序,有些很多复杂的SQL语句。而原作者由于未注重编写规范,无论保留字还是字段名一律小字且全在一行,读起来一塌糊涂。先要修改其格式规范,才好读懂语句的原义。
不过常用的Editplus对SQL语法的识别不那么智能,手动换行后颜色往往匹配不上,倒也会影响阅读。

[ 本帖最后由 涛tall 于 2007-11-3 11:42 编辑 ]

作者: 涛tall   发布时间: 2007-11-03

另外给点个人建议。

8.2.8减少出错的技巧1中才提过,“不使用短标识符”,“2.减少脚本中输出HTML”中给出的代码,却使用了短标识符:
复制PHP内容到剪贴板
PHP代码:

<table>
   <tr><td>姓名</td><td>位置</td><td>
   <?php foreach ($userArray as $userItem){ ?>
   <tr><td><? echo $userItem[Name]; ?></td><td><? echo $userItem[Position]; ?><td></tr>
   <?php } ?>
</table>
不知道是不是楼主疏忽贴露了,按1中所提的,应该写成这样才好:
复制PHP内容到剪贴板
PHP代码:
<table>
   <tr><td>姓名</td><td>位置</td><td>
   <?php foreach ($userArray as $userItem){ ?>
   <tr><td><?php echo $userItem[Name]; ?></td><td><?php echo $userItem[Position]; ?><td></tr>
   <?php } ?>
</table>
另外PHP代码嵌入到HTML中时,个人感觉采用流程控制的替代语法虽然会写起来麻烦些,但更易阅读。
引用:
PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。
所以上面的代码还可以写成:
复制PHP内容到剪贴板
PHP代码:
<table>
   <tr><td>姓名</td><td>位置</td><td>
   <?php foreach ($userArray as $userItem): ?>
   <tr><td><?php echo $userItem[Name]; ?></td><td><?php echo $userItem[Position]; ?><td></tr>
   <?php endforeach; ?>
</table>
[ 本帖最后由 涛tall 于 2007-11-3 11:58 编辑 ]

作者: 涛tall   发布时间: 2007-11-03

总觉得php太过于自由,希望有高效统一的规格会比较好些,感谢楼主啊

作者: siemenliu   发布时间: 2008-01-04

作者: siasford   发布时间: 2008-03-02

热门下载

更多