一、 命名规则
1. 命名规则概要
1) 使用含义丰富的名字
# good
if ($currentYear > 2009) ...
# bad
if($t > 2009) ...
2) 在缩写中,只将首字母大写
# good
function getHttpHost()
#bad
function getHTTPHost()
2. 类命名
1) 类应该以名词单数形式, 首字母大写, 大小写混排,方式命名
class SqlStatement { ... }
2) 表示一组事物的类应使用复数形式
class SqlStatements { ... }
3) 类型开头要比以类型结尾更容易识别
对一个已知类型的变量来说, 其名称以类型开头要比以类型结尾更容易识别
class ErrorConnection extends Error {
// ...
}
$arrCatids = array(1,2,3,4,5,6);
$strCatids = ‘1,2,3,4,5,6’;
4) 接口的默认实现类可以以Default开头
class DefaultSqlBuilder extends ISqlBuilder {
//...
}
3. 接口命名
接口的名字应为以字母”I”开头的名词或形容词
interface ISqlEngine{} interface ISortable{}
4. 变量/属性命名
1) 属性名应以小写字母开头, 采用驼峰法则.
public $userAuth;
3) 常量的名字必须全部为大写字母
所有字母大写,单词之间用下划线分割
const SEARCH_GOOGLE = 1;
const SEARCH_YAHOO = 2;
4) 命名一组对象时,应使用复数形式
public $books;
5) 布尔型变量不应使用否定性名字
# good
public $isFound;
public $isEnough;
# bad
public $isNotFound;
public $isNotEnough;
6) 在嵌套循环中,使用有意义丰富的名字来命名循环控制变量
# good
for($row = 0; $i < getRows();$row++) {
for($col= 0;$j < getCols(); $col++) {
// ...
}
}
# bad
for($i = 0; $i < getRows();$i++) {
for($j= 0;$j < getCols(); $j++){
// ...
}
}
7) 传入的变量采用蛇形写法, 自定义函数变量采用蛇形写法
# 控制器变量
class UserController extends Controller{
function postLogin(Request $request) {
// 这里是蛇形写法
$order_status = $request->input('order_status');
}
}
# 自定义函数变量
# 这里传入的变量采用蛇形写法
function route_url($route, $params, $option_params){
// ...
}
5. 函数命名
禁止拼音命名法
1) 类函数名称以小写字母开头, 采用驼峰法则
function getCurrentYear()
2) 用动词命名函数
# 动词表:
add / edit / remove
begin / end
create / destroy
first / last
get / release
get / set
increment / decrement
put / get
lock / unlock
open / close
min / max
old / new
start / stop
next / previous
source / target
show / hide
send / receive
cut / paste
up / down
# 系词表:
is / has
function startDatabase()
function getDatabaseStatus()
3) 函数名字可以忽略类或对象名称,以避免重复
# good
class Font {
function getFamily();
}
# bad
class Font {
function getFontFamily();
}
4) 单例类应该通过一个名为getInstance()的静态函数返回他们唯一的值
class Toolkit {
private static const toolkit = new Toolkit();
public static function getInstance(){
return toolkit;
}
}
二、 文件格式/ 技巧
1. 留白
恰当的使用空格可以有效提高代码的可读性
1) 使用空格的通用规则
操作符,冒号的前后都应有一个空格.
逗号,分号之后须有一个空格
# good
$bit = $bitStart + $bitEnd;
case 'someStr' :
mysqlConnection($config, $dbname);
if($count > 9)
#bad
$bit=$bitStart+$bitEnd;
case 'someStr':
mysqlConnection($config,$dbname);
if($count>9)
2) 逻辑单元应该以空行分割
function drawCapture() {
$chars = getChars(5);
// imageCreate
$img = imageCreate();
// output image
outputImage();
}
2. 控制流程
1) for,while,if语句格式如下
# for
for (init; condition; update) {
// ...
}
# while
while (condition) {
// ...
}
# if
if (condition) {
// ...
} else if (condition) {
// ...
} else {
// ...
}
2) 循环/条件语句必须以 ‘{‘ , ’}’嵌套
# good
if ($i > 0) {
$val ++;
}
for ($i = 0; $i < $size; $i++) {
$val ++;
}
# bad
for($i=0; $i<$size; $i++) $val ++;
if($i > 0) $val ++;
3) 使用临时变量以避免复合条件语句
# good
$itemValid = $itemMoney > 800 && $level > 3 && $valid > 0;
if($itemValid && isReady()) {
display();
}
# bad
if($itemMoney > 800 && $level > 3 && $valid > 0 && isReady()) {
display();
}
4) Switches 语句应该套用以下格式,并且每个分支必须注释清楚
switch (condition) {
case 0:
// show something
break;
default:
// this is some code
}
3. 声明
1) 类/接口声明顺序
类文档中的语句的顺序.
1. 文档/注释
2. 类/接口语句
3. 常量
4. 静态变量顺序:[public, protected, (default), private]
5. 实例变量顺序:[public, protected, (default), private]
6. 构造函数 __construct();
7. 函数 function;
2) 变量的声明要在代码块的开头,而不是在用到它们的地方
public function method() {
$value = 0;
...
for (...) {
$value += $num;
}
}
4. 技巧
删除文件尾部的 ?>
php文件的典型标记是以 <?php开头, ?>结尾。但是在Zend Framework中却不推荐在php文件末尾加 ?>
因为在<?php ?>之外的任何字符都会被输出到网页上,而之中的却不会。所以在末尾不加?>可以预防php文件被恶意加入字符输出到网页。
数组的键名
在PHP中, 使用不经单引号包含的字符串作为数组键名是合法的, 但是我们不希望如此 -- 键名应该总是由单引号包含而避免引起混淆. 注意这是使用一个字符串, 而不是使用变量做键名的情况
// 错误
$foo = $assoc_array[blah];
// 正确
$foo = $assoc_array['blah'];
// 错误
$foo = $assoc_array["$var"];
// 正确
$foo = $assoc_array[$var];
不要使用未初始化的变量
// 错误
if ($forum) ...
// 正确
if (isset($forum)) ...
// 正确
if (isset($forum) && $forum == 5)
避免在大数组上使用 in_array()
避免在大的数组上使用 in_array(), 同时避免在循环中对包含200个以上元素的数组使用这个函数. in_array()会非常消耗资源. 对于小的数组这种影响可能很小, 但是在一个循环中检查大数组可能会需要好几秒钟的时间. 如果您确实需要这个功能, 请使用isset()来查找数组元素. 实际上是使用键名来查询键值. 调用 isset($array[$var])
会比 in_array($var, array_keys($array))
要快得多.
SQL 脚本格式
SQL 代码常常会变得很长, 如果不作一定的格式规范, 将很难读懂. SQL代码一般按照以下的格式书写, 以关键字换行:
$sql = 'SELECT *
<-one tab->FROM ' . SOME_TABLE . '
<-one tab->WHERE a = 1
<-two tabs->AND (b = 2
<-three tabs->OR b = 3)
<-one tab->ORDER BY b';
这里是应用了制表符後的例子:
$sql = 'SELECT *
FROM ' . SOME_TABLE . '
WHERE a = 1
AND (b = 2
OR b = 3)
ORDER BY b';
禁止使用单字母开头的变量
$tKey, $tVal
5. 空行的使用
<?php 之后必须有1个空行
两个函数之间必须有1个空行。
return、die、exit之前如果有其他语句的情况下应加上一个空行
三、 文档与注释
1. PHPDoc
PHPDoc 是一个 PHP 版的 Javadoc。它是一种注释 PHP 代码的正式标准。它支持通过类似 phpDocumentor 这样的外部文档生成器生成 API 文档,也可以帮助一些例如 Zend Studio, NetBeans, ActiveState Komodo Edit and IDE 和 Aptana Studio 之类的 集成开发环境 理解变量类型和弱类型语言中的其他歧义并提供改进的代码完成,类型提示和除错功能。
参考地址: http://zh.wikipedia.org/zh/PH...
2. 注释
注释类
/**
* 这是某个类的介绍
*/
class SomeClass{}
注释局部变量
function someFunction(){
var $result; //获取到的结果集
var $searchResult; //获取到的搜索结果集
// ...
}
注释变量
/** @var name string */
public $name
注释函数
注释的标记应按照以下顺序
* @param
* @return
* @see
3. PHP文档头部注释
/**
* 文件头部说明
*
* @author Mark (zhaody901@126.com)
* @copyright Copyright (c) 2014-2016 sour-lemon team
*/
框架常用命名
控制器方法
getIndex() # 列表
getCreate() # 创建
postCreate() # 保存创建
getEdit() # 编辑
postEdit() # 保存编辑
postUpdate() # 批量更新
postDelete() # 删除到回收站
postDestroy() # 彻底删除
附录Appendices
附录A:参考文档
PHPBB 编码规范
http://www.phpbbchina.com/wik...编码规范Typecho PHP 编码规范
https://code.google.com/p/typ...优化编写代码过程中的PHP
http://www.yeeyan.org/article...
附录B:PHPDoc 标签参考
在线版地址 : http://manual.phpdoc.org/HTML...
@abstract Documents an abstract class, class variable or method.
@access public, private or protected Documents access control for an element. @access private indicates that documentation of element be prevented.
@author author name <author@email> Documents the author of the current element.
@category Specify a category to organize the documented element’s package into
@copyright name date Documents copyright information.
@deprecated version Documents a method as deprecated.
@example /path/to/example Documents the location of an external saved example file.
@exception documents an exception thrown by a method — also see @throws.
@global type $globalvarname Documents a global variable or its use in a function or method.
@ignore Prevents the documentation of an element
@internal private information for advanced developers
@link URL
@name global variable name Specifies an alias for a variable. For example, $GLOBALS[‘myvariable’] becomes $myvariable
@magic phpDocumentor tags}-.
@package name of a package Documents a group of related classes and functions.
@param type [$varname] description
@return type description This tag should not be used for constructors or methods defined with a void return type.
@see Documents an association to another method or class.
@since version Documents when a method was added to a class.
@static Documents a static class or method
@staticvar Documents a static variable’s use in a function or class
@subpackage
@throws Documents an exception thrown by a method.
@todo Documents things that need to be done to the code at a later date.
@var type a data type for a class variable
@version Provides the version number of a class or method.
附录C: 版本变化
v1.4(2016年10月07日)
更改为markdown格式, 并且将其替换为Laravel 编码格式
V1.3(2015年4月19日)
项目文件结构说明
V1.2(2013年4月27日)
分离项目公共部分
V1.1(2013年4月2日)
增加左格式化内容
增加删除 ?>
标记
V1.0(2012年11月7日)
初始化规范
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。