所在位置:首页 > 学习心得 > php书写规范文档
php书写规范文档
  • php书写规范文档
    发布时间:2011-09-01 类别:PHP技术 来源:侠客工作室
    • 1
    • 2
    • 3
    • 4
    • 5
  • 1、本规范由编程原则组成,融合并提炼了开发人员长时间积累下来的成熟经验,意在帮助形成良好一致的编程风格。以达到事半功倍的效果,如果有需要本文档会不定期更新。
    2. 适用范围
    如无特殊说明,以下规则要求完全适用于phpcms项目,同时也可大部分适用于公司其他PHP项目。
    3. 标准化的重要性和好处
    当一个软件项目尝试着遵守公共一致的标准时,可以使参与项目的开发人员更容易了解项目中的代码、弄清程序的状况。使新的参与者可以很快的适应环境,防止部分参与者出于节省时间的需要,自创一套风格并养成终生的习惯,导致其它人在阅读时浪费过多的时间和精力。而且在一致的环境下,也可以减少编码出错的机会。缺陷是由于每个人的标准不同,所以需要一段时间来适应和改变自己的编码风格,暂时性的降底了工作效率。从使项目长远健康的发展以及后期更高的团队工作效率来考虑暂时的工作效率降低是值得的,也是必须要经过的一个过程。标准不是项目成功的关键,但可以帮助我们在团队协作中有更高的效率并且更加顺利的完成既定的任务。
    1. 程序员可以了解任何代码,弄清程序的状况
    2. 新人可以很快的适应环境
    3. 防止新接触PHP的人出于节省时间的需要,自创一套风格并养成终生的习惯
    4. 防止新接触PHP的人一次次的犯同样的错误
    5. 在一致的环境下,人们可以减少犯错的机会
    6. 程序员们有了一致的敌人
    4. PHP编码规范与原则
    4.1.代码标记
    PHP程序可以使用或来界定 PHP 代码,在HTML页面中嵌入纯变量时,可以使用这样的形式。
    近年来PHP开发组一直倡导代码规范化和标准化,未来版本PHP可能会开始不建议使用甚至取消和这种速记形式,因此为了加强程序兼容性,在发布之前我们将统一把query(”SELECT m.*, i.*
    FROM “.TABLE_MEMBER.” m, “.TABLE_MEMBERINFO.” i
    WHERE m.userid=i.userid AND m.userid=’$_userid’);
    5.3.性能与效率
    5.3.1. 定长与变长表
    包含任何varchar、text等变长字段的数据表,即为变长表,反之则为定长表。
    l 对于变长表,由于记录大小不同,在其上进行许多删除和更改将会使表中的碎片更多。需要定期运行OPTIMIZE TABLE以保持性能。而定长表就没有这个问题;
    l 如果表中有可变长的字段,将它们转换为定长字段能够改进性能,因为定长记录易于处理。但在试图这样做之前,应该考虑下列问题:
    l 使用定长列涉及某种折衷。它们更快,但占用的空间更多。char(n) 类型列的每个值总要占用n 个字节(即使空串也是如此),因为在表中存储时,值的长度不够将在右边补空格;
    l 而varchar(n)类型的列所占空间较少,因为只给它们分配存储每个值所需要的空间,每个值再加一个字节用于记录其长度。因此,如果在char和varchar类型之间进行选择,需要对时间与空间作出折衷;
    l 变长表到定长表的转换,不能只转换一个可变长字段,必须对它们全部进行转换。而且必须使用一个ALTER TABLE语句同时全部转换,否则转换将不起作用;
    l 有时不能使用定长类型,即使想这样做也不行。例如对于比255字符更长的串,没有定长类型;
    l 在设计表结构时如果能够使用定长数据类型尽量用定长的,因为定长表的查询、检索、更新速度都很快。必要时可以把部分关键的、承担频繁访问的表拆分,例如定长数据一个表,非定长数据一个表。例如phpcms的phpcms_member表等。因此规划数据结构时需要进行全局考虑;
    进行表结构设计时,应当做到恰到好处,反复推敲,从而实现最优的数据存储体系。
    5.3.2. 运算与检索
    数值运算一般比字符串运算更快。例如比较运算,可在单一运算中对数进行比较。而串运算涉及几个逐字节的比较,如果串更长的话,这种比较还要多。
    如果串列的值数目有限,应该利用普通整型或emum类型来获得数值运算的优越性。
    更小的字段类型永远比更大的字段类型处理要快得多。对于字符串,其处理时间与串长度直接相关。一般情况下,较小的表处理更快。对于定长表,应该选择最小的类型,只要能存储所需范围的值即可。例如,如果mediumint够用,就不要选择bigint。对于可变长类型,也仍然能够节省空间。一个TEXT 类型的值用2 字节记录值的长度,而一个LONGTEXT 则用4字节记录其值的长度。如果存储的值长度永远不会超过64KB,使用TEXT 将使每个值节省2字节。
    5.3.3. 结构优化与索引优化
    索引能加快查询速度,而索引优化和查询优化是相辅相成的,既可以依据查询对索引进行优化,也可以依据现有索引对查询进行优化,这取决于修改查询或索引,哪个对现有产品架构和效率的影响最小。
    索引优化与查询优化是多年经验积累的结晶,在此无法详述,但仍然给出几条最基本的准则。
    首先,根据产品的实际运行和被访问情况,找出哪些SQL语句是最常被执行的。最常被执行和最常出现在程序中是完全不同的概念。最常被执行的SQL语句,又可被划分为对大表(数据条目多的)和对小表(数据条目少的)的操作。无论大表或小表,有可分为读(SELECT)多、写(UPDATE/INSERT)多或读写都多的操作。
    对常被执行的SQL语句而言,对大表操作需要尤其注意:
    l 写操作多的,通常可使用写入缓存的方法,先将需要写或需要更新的数据缓存至文件或其他表,定期对大表进行批量写操作。同时,应尽量使得常被读写的大表为定长类型,即便原本的结构中大表并非定长。大表定长化,可以通过改变数据存储结构和数据读取方式,将一个大表拆成一个读写多的定长表,和一个读多写少的变长表来实现;
    l 读操作多的,需要依据SQL查询频率设置专门针对高频SQL语句的索引和联合索引。
    而小表就相对简单,加入符合查询要求的特定索引,通常效果比较明显。同时,定长化小表也有益于效率和负载能力的提高。字段比较少的小定长表,甚至可以不需要索引。
    其次,看SQL语句的条件和排序字段是否动态性很高(即根据不同功能开关或属性,SQL查询条件和排序字段的变化很大的情况),动态性过高的SQL语句是无法通过索引进行优化的。惟一的办法只有将数据缓存起来,定期更新,适用于结果对实效性要求不高的场合。
    MySQL索引,常用的有PRIMARY KEY、INDEX、UNIQUE几种,详情请查阅MySQL文档。通常,在单表数据值不重复的情况下,PRIMARY KEY和UNIQUE索引比INDEX更快,请酌情使用。
    事实上,索引是将条件查询、排序的读操作资源消耗,分布到了写操作中,索引越多,耗费磁盘空间越大,写操作越慢。因此,索引决不能盲目添加。对字段索引与否,最根本的出发点,依次仍然是SQL语句执行的概率、表的大小和写操作的频繁程度。
    5.3.4. 查询优化
    MySQL中并没有提供针对查询条件的优化功能,因此需要开发者在程序中对查询条件的先后顺序人工进行优化。例如如下的SQL语句:
    SELECT * FROM table WHERE a>’0’ AND b’0’还是b’0’
    最优索引:INDEX abc (b, a, c)
    原因:b’0’作为第一条件,则只能先过滤掉25%的结果
    注意1:字段c由于未出现于条件中,故条件顺序优化与其无关
    注意2:最优索引由最优条件顺序得来,而非由例子中的SQL语句得来
    注意3:索引并非修改数据存储的物理顺序,而是通过对应特定偏移量的物理数据而实现的虚拟指针
    EXPLAIN语句是检测索引和查询能否良好匹配的简便方法。在phpMyAdmin或其他MySQL客户端中运行EXPLAIN+查询语句,例如EXPLAIN select * FROM table WHERE a>’0’ AND b
    模板中所有的逻辑体,如{if}、{loop}等,必须前后使用HTML注释(),即类似的形式。事实上,phpcms模板编译器是支持不加HTML注释的逻辑体写法的,但加入注释可以使得模板可读性更好,同时方便用户使用DreamWeaver或FrontPage等对模板进行修改。
    6.2.书写规则
    6.2.1. HTML
    所有HTML标记参数赋值需使用双引号包含,例如,应当使用
    而绝对不能使用

    在任何情况下,产品中的模板文件必须采用手写HTML代码的方式,而绝对不能使用DreamWeaver、FrontPage等自动网页制作工具进行撰写或修改。
    6.2.2. 变量
    模板中使用的变量,依据作用和出现位置不同,分为几种方式:
    l 逻辑体中,即被包围起来的部分,例如这种形式,其中的变量书写规范与PHP程序中完全一致;
    开发者需要使用{}将变量括起来,以免出现模板编译错误,可能的情况如下:
    l 变量前后含有中括号的或其他敏感字符的(包括但不限于“$”、“’”等),正确的写法为descriptionnew[{$buddy[buddyid]}];
    l 数组的下标为变量的,正确的写法为{$extcredits[$creditstrans][title]};
    l 其他变量十分复杂的情况。
    6.2.3. 语言元素
    6.2.4. 缩进
    在phpcms的*.html模板文件中,由于具备逻辑结构,故不考虑任何HTML本身的缩进,所有缩进均意为着逻辑上的缩进结构。缩进采用TAB方式,不使用空格作为缩进符号,仅需适当断行即可。例如:
       
        {$article[‘title’]}
       
    7. 文件与目录
    7.1.文件命名
    所有包含PHP代码的程序文件或半程序文件,应以小写.php作为扩展名,而不要使用.phtml、.php3、.inc、.class等作为扩展名。
    普通程序
    能够被URL直接调用的程序,例如list.php、index.php,直接使用程序名+.php的方式命名
    函数库和类库程序
    分别以小写.func.php和.class.php作为扩展名。函数库和类库程序只能被其他程序引用,而不能独立运行。其中不能包含任何流程性的、不属于任何函数或类的程序代码。
    流程性程序
    以小写.inc.php作为扩展名。只能被其他程序引用,而不能独立运行。其中不能包含任何函数或类代码的程序代码。
    模板源文件
    以小写.html作为扩展名。模板源文件按照phpcms模板编码规则进行编写,不是可以执行的程序,而只能被phpcms模板编译器所解析,放置于./templates/default或./templates下的其他模板目录下。
    模板目标文件
    模板文件被编译后自动生成的目标程序,以小写. php作为扩展名,存放于./data/templates目录下。
    语言包文件
    以小写.lang.php作为扩展名,只能存放模板或程序使用的语言包信息。
    缓存文件
    此类文件为系统自动生成,以cache_xxx.php、usergroup_xxx.php、style_xxx.php等类似形式命名,存放于./data/cache目录下。
    7.2.目录命名
    phpcms目录命名以前面《4.4命名原则》的约定为基本准则。在可能的情况下,多以复数形式出现,如./templates、./images等。
    由于目录数量较少,因此目录命名大多是一些习惯和约定俗成,开发人员如需新建目录,应与项目组成员进行磋商,达成一致后方可实施。
    7.3.空目录索引
    请在所有不包含普通程序(即能够被URL直接调用的程序)的目录中放置一个1字节的index.htm文件,内容为一个空格。几乎除phpcms根目录以外,所有目录都属于这一类型,因此开发者需要在这些目录全部放入空index.htm文件,以避免当http服务器的Directory Listing打开时,服务器文件被索引和列表。
    附件目录等敏感目录,要在程序中实现相应功能,当新建下级目录时,必须自动写入一个空的index.htm文件,以避免新建目录被索引的问题。
  • 中搜索:php书写规范文档   中搜索:php书写规范文档
    中搜索:php书写规范文档   中搜索:php书写规范文档
    中搜索:php书写规范文档  中搜索:php书写规范文档
  • ☆☆☆技术交流群:5684178☆☆☆
  • 上一篇:php 汉字转换成拼音代码
  • 下一篇:discuz X2完美去掉forum.php
侠客工作室主要承揽网站制作|企业建站|北京网站制作|北京网站建设|北京企业建站|专业仿站|SEO优化等业务
地址:北京市海定区清河水木天成 电话:13718388147 13718388147 传真:13718388147 访问统计:
投诉电话:13718388147 投诉QQ:点击这里给我发消息 客服信箱:1300105556@qq.com 邮编:102200 北京网站建设地图 北京网站建设RSS地图
版权所有 2009-2014侠客工作室【北京网站建设】 京ICP备11021494号-1