Xiuno 全栈工程师编码规范
版本:v1.0作者:****************时间:2015/3/20 一、PHP 编码规范与原则
前言:本文档是一本面向全栈工程师的编码规范,如果你想成长为全栈式工程师,我相信这个规范是你成功的起点。总体说来倾向于linux 系统编程的风格,nginx memcached mysql lighttpd 都是采用的小写加下划线的命名风格。而Windows Java 采用的则是匈牙利和骆驼,没有谁好谁坏,习惯就好。
1.1 缩进:
每个TAB 键缩进的空白为8 个空格字符宽度。
好处:尽量避免代码缩进,强迫在编写过程中简化逻辑。
1.2 空行与空格:
大段代码应该尽量按照功能块用一个空行分割。
函数和函数之间应该有一个空行。
空行内不能包含空格或制表符。
HTML 中不允许出现连续1个以上的空格。
在提示信息或者文档中中文、英文、数字混排的时候,英文和数组应该前后加空格。
1.3 括号:
if 紧跟小括号,小括号与大括号之间一个空格,开始大括号与if 同行。
如果业务逻辑简单,尽量使用AND 操作符,优先级比&& 低。
以下代码格式符合标准:
if($method == 'GET') {
$referer = user_http_referer();
$title = $lang['user_create'];
include './view/user_create.htm';
} else if($method == 'POST') {
$email = param('email');
$password = param('password');
empty($password) AND message(1, “请输入密码!”);
}
1.3 单引号、双引号
在PHP 当中,尽量使用单引号,解析速度比双引号快。
如果里面包含变量,为了代码的美观,可以使用双引号。
在双引号中的数组key 不应该加单引号
在单引号中仅仅转义\,其他字符都不转义,如\t\r\n $
以下为正确用例:
$sitename = …阿里粑粑中国‟;
$info = “站点名称:$sitename”;
$info = “用户名:$user[name]”;
1.4 变量命名:
变量使用小写加下划线
不要使用骆驼和匈牙利,除非js 对DOM prototype 进行扩展(保持与原生一致)。
常量:大写+下划线
尽量的准确、简短,尽量不要缩写,采用非常见缩写方式需通报团队。
从数据库中取出的一行结果为:$user, 结果集名称:$userlist
1.5 函数名:
同变量名,相同类的函数使用统一前缀,如:
mysql_connect()
mysql_query()
mysql_fetch_assoc()
1.6 类、继承、接口、构造、析构、魔术方法:
尽量不要使用PHP 高级特性,但是需要懂(为了阅读他人代码)。
高级特性消耗自己和同事更多的学习成本,往往与带来的好处不成正比。
不是刚需,不要用。
1.7 正则表达式:
尽量使用单引号,分隔符为#
禁止使用  e 修饰符,如果刚需,请使用preg_replace_callback() 代替
以下正则格式符合标准:
preg_match(…#\w+@\w+\.\w+#is‟, $email);
尽量使用\w \s \S 内置的表示方法,不要啰嗦的去写[0-9a-zA-Z_]。代码运行js特效
为什么不用/ 作为分隔符?
因为WEB 开发过程中,字符串中出现/ 的概率太高。
1.8 include include_once require require_once:
尽量使用include,速度快,并且不会中断业务逻辑。
require 在文件不存在或不可读的时候,会暴力终止业务逻辑。
路径采用相对路径,一般相对于网站根目录./
切换路径的时候使用:
<?php
chdir(getcwd().'/../');
include './common.inc.php';
>
1.9 error_reporting:
在本地开发环境下使用,使用E_ALL,消灭所有NOTICE。
线上环境使用0,并且配置php.ini error_log 记录到服务器日志,避免错误信息外泄。
1.10 模板:
不要用Smarty 等任何类型的模板“引擎”,他们不时真正意义上的引擎,只是一堆正则替换而已。而且效率低下,学习的时间成本高,浪费脑细胞。
直接使用PHP 的原生标签,比如:
<?php include "./view/header.inc.htm"; ?>
<div id="body">
Hi, boy! welcome to <?=$sitename?>! Here, no smarty shit!
</div>
<?php include "./view/footer.inc.htm"; ?>
1.11 数据传输协议:
服务端返回{code:0, message: “成功”} 这种json 格式的数据。
code 为数值,0 代表成功,< 0 代表系统错误,> 0 代表业务逻辑错误。
Ajax 获取服务端数据,系统和系统之间进行数据交换时采用,如
{code: -1, message:“Mysql error: lost connection.”}
{code: 1, message: “用户名格式不对”}
{code: 2, message: “密码不能为空”}
{code: 0, message: “成功”}
二、MySQL 表设计和SQL语句规范
2.1 表和列的名称:
所有的表都不允许加s,并且以小引号括住,比如`bbs_user`, `bbs_forum`, `bbs_online`。
字段名加s 一般表示总数:views, users, posts。
2.2 列相关:
尽量采用含义准确,容易拼写的单词
字段空间应该足够小,减少内存和磁盘空间。
尽量采用char,避免varchar text,数据量大的时候定长扫描速度要远远超过变长。
时间用int, 存UNIX时间戳,不要用date time 数据类型,不利于移植和计算。
时间字段的名称规范为:create_date last_date expiry_date ...
2.3 :SQL 语句
SQL 语句一律为大写,以下SQL 符合规范:
SELECT * FROM `user` WHERE `uid` = 1;
2.4 :性能
尽量采用定长表,int char 为定长,text varchar 为变长
在变长表上定期采用OPTIMIZE TABLE `user` 整理磁盘碎片
char(255) 占用更多的空间,根据字符集不同,占用的宽度不同,latin1 为1个字节,gbk 2个字节,utf8 3个字节
为了程序的简便,尽量全部采用UTF-8编码。
ALTER TABLE 时,如果数据量大,锁表时间会比较长,一般避免在高峰期运行。为了稳妥一般采用停站升级。
如果一个表记录行数比较多,我们简称为大表,反之为小表。
大表中如果既包含定长又包含变长,可以考虑将其拆分成2个表,一个定长一个变长。
UPDA TE LOW_PRORITY、INSERT DELAY关键字可以延迟写入,尽量避免锁表,但是会导致返回值为空,对于返回结果要求不严格的可以采用。
尽量不要使用GROUP BY、HA VING、DISTINCT 等关键词,在数据量大的时候消耗很大。
不用采用LEFT JOIN、INNER JOIN 等语法,会产生读锁,影响写入。正确做法,从MySQL 读多次,PHP 端合并结果。
2.4 :索引优化
索引的数据结构一般为BTREE、HASH、RTREE、FULLTEXT。
BTREE是趋左的,查的复杂度大约在logN左右,与WHERE 语句要严格匹配时才会生效。
HASH 的复杂度为O(1),但是一般总记录不超过6w 行。
RTREE用于地理位置范围查,用法基本等价于两列联合索引产生的效果。
索引过多会导致写入变慢,锁表锁索引时间变长。
一个表尽量控制在3-5个索引。
需要更多索引可以考虑冗余的小表来解决。
采用EXPLAIN 来分析SQL 的性能。
主从的索引结构可以不一致,同步的是通过SQL语句同步。这里需要反复斟酌。
USING HASH/BTREE/FULLTEXT 用来指定索引的数据结构,默认为BTREE。
MyISAM KEY的长度为1000,尽量不要太长。
FULLTEXT 索引对中文无效,对英文是以空格和符号为单词分割。
中文索引一般采用第三方解决方案,如sphinx lucene
以下为创建表的一个范例:
CREA TE TABLE `user`(
`name` char(50) NOT NULL DEFAULT '',
KEY USING HASH(`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLA TE=utf8_general_ci;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。