PSR PHP业界规范
http://psr.phphub.org/
https://blog.csdn.net/u013933858/article/details/79780179
0x0 大型项目的问题
随着项目越来越大,参与的人数越来越多,代码变得越来越不可维护了。
每个人都给项目带来自己的风格,所以这时就需要大家采用一个统一的标准。
0x1 解决办法
于是顶尖的PHPer们讨论确定了PHP的一些常用规范,并成立了FIG组织。
目标在于制定一个协作标准,各个框架遵循统一的编码规范,避免各家自行发展的风格阻碍了 PHP 的发展,解决这个程序设计师由来已久的困扰。
这些标准包括代码层面的如代码格式,代码风格;代码加载;还有各种实用的
接口。已经通过的规范有:
- PSR1 基础编码规范
- PSR2 编码风格规范
- PSR3 日志接口规范
- PSR4 自动加载规范
- PSR6 缓存接口规范
- PSR7 HTTP 消息接口规范
(注:PSR 指PHP Standard Recommendations PHP推荐标准,FIG指 Framework Interoperability Group 框架可互用性小组)
0X3 好处
虽然FIG是民间组织,然而由于众多的框架作者都参与其中,而且官方也有人参加,PSR实际上
已经成为了业界事实上的标准。如果某个框架遵循这些标准,那么各个框架间的代码就可以通用,比如slim框架遵循了PSR7,那么你就可以用其它
遵循PSR7的组件来替换自带的。
另外对于使用者来说,学习和迁移成本也降低了。
PSR 不是PHP官方标准,而是从如Zend、Symfony2等知名PHP项目中提炼出来的一系列标准,目前有越来越多的社区项目加入并遵循该标准。
PSR-0 自动加载 X已废弃
PSR-1 基本代码规范
PSR-2 代码样式
PSR-3 日志接口
PSR-4 如何指定文件路径从而自动加载类定义
PSR-1基本代码规范
本篇规范制定了代码基本元素的相关标准,以确保共享的PHP代码间具有较高程度的技术互通性。
文件
· PHP代码文件 必须 以 <?php 或 <?= 标签开始;
· PHP代码文件 必须 以 不带 BOM 的 UTF-8 编码;
· PHP代码中 应该 只定义类、函数、常量等声明,或其他会产生 副作用 的操作(如:生成文件输出以及修改 .ini 配置文件等),二者只能选其一;
命名空间与类
· 类命名 必须 遵循 StudlyCaps 大写开头的驼峰命名规范;
· 每个类都独立为一个文件,且命名空间至少有一个层次:顶级的组织名称(vendorname)
类属性:小写开头驼峰 $studlyCaps
类方法:小写开头驼峰
常量
· 类中的常量所有字母都 必须 大写,单词间用下划线分隔;
方法名称 必须 符合 camelCase 式的小写开头驼峰命名规范。
PSR-2编码风格规范
缩进
· 代码 必须 使用4个空格符而不是「Tab 键」进行缩进。
行
每行的字符数 应该 软性保持在 80 个之内,一定不可 多于 120 个,但 一定不可 有硬性限制。
所有PHP文件必须以一个空白行作为结束。
每行 一定不可存在多于一条语句
每个 namespace 命名空间声明语句和 use 声明语句块后面,必须 插入一个空白行。
类的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须 写在函数主体后自成一行。
方法的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须 写在函数主体后自成一行。
控制结构的开始花括号({) 必须 写在声明的同一行,而结束花括号(}) 必须 写在主体后自成一行。
修饰符
类的属性和方法 必须 添加访问修饰符(private、protected 以及 public),abstract 以及final 必须 声明在访问修饰符之前,而 static 必须 声明在访问修饰符之后。
空格
类方法参数每个逗号后面必须要有一个空格,而逗号前面 一定不可 有空格
控制结构的开始左括号后和结束右括号前,都 一定不可 有空格符。
关键字
· 控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不可有。
PHP所有 关键字 必须 全部小写,常量 true 、false 和 null 也 必须 全部小写。
PSR-3日志接口规范
LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency 。
第九个方法 —— log,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须 与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,则 必须 抛出Psr\Log\InvalidArgumentException 类型的异常。在不确定的情况下,使用者 不该 使用未支持的等级常量来调用此方法。
/**
* 日志等级常量定义
*/
class LogLevel
{
constEMERGENCY='emergency';
constALERT ='alert';
constCRITICAL ='critical';
constERROR ='error';
constWARNING ='warning';
constNOTICE ='notice';
constINFO ='info';
constDEBUG ='debug';
}
PSR-4自动加载规范
类似如下范例:<NamespaceName>(<SubNamespaceNames>)*<ClassName>
1. 完全合规类名必须有一个顶级命名空间(Vendor Name)
2. 完全合规类名可以有多个子命名空间
3. 完全合规类名应该有一个终止类名
4. 下划线在完全合规类名中是没有特殊含义的
5. 字母在完全合规类名中可以是任何大小写的组合
6. 所有类名必须以大小写敏感的方式引用
7. 终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配
一些常用的自定义规范
控制层
1. 不出现sql语句(sql封装到模型层然后作为方法调用)
2. sql语句、3行以上逻辑代码空行
3. 上下文关系函数或方法间不空行
4. bool使用if(true === $name)的形式
5. 使用双引号链接变量
6. 注意隐式转换
7. 使用全局变量需要注释其含义,取值范围
/**
* 全局变量总体说明
* Global STATUS_CODE
* 0 - SUCCESS
* 2 - ERROR
*/
STATUS_CODE
8. 函数头部如下注释:
/*************************************************
Function: // 函数中文名称
Description: // 函数功能、性能等的描述
Calls: // 被本函数调用的函数清单
Called By: // 调用本函数的函数清单
Table Accessed: // 被访问的表(此项仅对于牵扯到数据库操作的程序)
Table Updated: // 被修改的表(此项仅对于牵扯到数据库操作的程序)
Input: // 输入参数说明,包括每个参数的作用、取值说明及参数间关系。
Output: // 对输出参数的说明。
Return: // 函数返回值的说明
Others: // 其它说明
*************************************************/
9. 注释间空行
// code one comments
program code one
// code two comments
program code two
10. 文件头部注释
/************************************************************
Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. // 版权
FileName: test.cpp // 文件名
Author: // 作者
Version : // 版本
Date: // 日期
Description: // 模块描述
Function List: // 主要函数及其功能
History: // 历史修改记录
<author> <time> <version > <desc>
Lizhijian 17/10/11 1.0 init
***********************************************************/
11. switch语句的case跳转需要注释
12. 标记变量的命名:
temp 可缩写为 tmp ;
flag 可缩写为 flg ;
statistic 可缩写为 stat ;
increment 可缩写为 inc ;
message 可缩写为 msg ;
13.接口的命名前缀
add / remove begin / end create / destroy
insert /delete first / last get / release
increment /decrement put / get
add /delete lock / unlock open / close
min /max old / new start / stop
next /previous source / target show / hide
send /receive source / destination
cut /paste up / down
14.状态码尽量使用常量,而不是难以理解的数字
应改为如下形式。
#defineTRUNK_IDLE 0
#define TRUNK_BUSY 1
if (Trunk[index].trunk_state == TRUNK_IDLE)
{
Trunk[index].trunk_state = TRUNK_BUSY;
... //program code
}
15. 类文件名使用首大写驼峰方式,普通文件名使用下划线方式
16. 配置里的变量名使用下划线方式
1. 变量自增自减写到表达式前面: --e >= $name
2. 程序顺序应该遵循:参数定义代码->判断逻辑代码->业务逻辑代码
3. 大的数据使用引用
4. 为逻辑代码里每个复杂度高/重复度高的代码添加注释
5. 尽量不为简短代码引入新的变量,减少变量污染
1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
6、尽量避免使用__get,__set,__autoload。
7、require_once()代价昂贵。
8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
10、函数代替正则表达式完成相同功能。
11、str_replace函数比preg_replace函数快,str函数的效率是str_replace函数的四倍。
12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
14、用@屏蔽错误消息的做法非常低效,极其低效。
15、打开apache的mod_deflate模块,可以提高网页的浏览速度。
16、数据库连接当使用完毕时应关掉,不要用长连接。
17、错误消息代价昂贵。
18、避免递增全局变量
原文链接:https://blog.csdn.net/u013933858/article/details/79780179
PSR PHP业界规范相关推荐
- vim php psr,PHP编码规范(PSR-1)-基本代码规范
PSR-1 基本代码规范 1. 概况 代码文件必须以<?php或 <?= 标签开始 代码文件必须以不带BOM头的 UTF-8 编码 代码文件中应该只定义类(class).函数(functi ...
- 实战分享:淘宝Web 3D应用与游戏开发
大家下午好!我们今天讲个比较有意思的话题,这个话题在业界被谈及得比较少.大家在座有做过移动端开发的同学吗?请举个手,人还挺多的.那做过3D应用的同学请举个手,有用过Threejs的请举个手,做过游戏的 ...
- shell编程基础之基本文本工具集合
一 shell简介: 1 描述 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用 ...
- Linux的shell scripts
一.什么是脚本(scripts) 安装一定逻辑关系记录的命令文件,在此文件有可执行权限的情况下可以用文件名称发起脚本内记录命令的执行,shell脚本是一种解释性语言,文件内记录的动作需要解释器shel ...
- 解密初、中、高级程序员的进化之路
程序员的标准与要求 初级程序员 仅能完成简单模块和项目的开发工作,难以胜任复杂模块的开发.通常是入行不久, 1 年及以下工作经验的同学. 能力要求 熟悉前端基础知识如 HTML.JS.CSS . 能够 ...
- 使用HBase Client访问阿里云NoSQL数据库表格存储
Apache HBase Apache HBase是Hadoop database,属于Hadoop生态系统. 自从十四年前Google相继发布论文:<The Google File Syste ...
- python变量如何使用,python如何使用变量
使用变量之前,我们先来说说什么是变量 变量,顾名思义就是可以改变的量.和C.Java一样,python程序的编写也是需要一个一个的变量作为支架,搭建起更大的框架.在python中,变量是存储在内存中的 ...
- 矢量切片_数据粒度均衡的二维矢量瓦片构建方法
作 者 信 息 应 申1,2,王子豪1,杜志强3,丁火平4, 李翔翔4 (1. 武汉大学 资源与环境科学学院,湖北 武汉 430079:2. 自然资源部城市国土资源监测与仿真重点实验室,广东 深圳 5 ...
- 【php】命名空间 和 自动加载的关系
目的 本文的目的主要是说明 命名空间的 use 关键词 和 new ClassName 这两个步骤,哪个步骤才会执行自动加载,这是逻辑有点混乱的表现,这种想法也是很正常的,让我们来解密吧 命名空间(n ...
最新文章
- 新闻网站项目django--注册页
- [Android]ListView控件之Adapter性能优化
- 【学习笔记】ABAP OOD设计模式 - 桥接模式
- synamic-datasource-spring-boot-starter实现动态数据源Mysql和Sqlserver
- VTK:移除外表面用法实战
- html中el表达式遍历list,使用EL表达式访问集合
- Mongo查询数据库及表占用磁盘大小
- PAT_1038_统计相同成绩的学生(20)
- angularjs1-2,作用域、代码压缩
- 倒计时 5 天!Apache Flink Meetup · 北京站,1.13 新版本 x 互娱实践分享的开发者盛筵!...
- 安装 EoLinker_4.0 开源版
- 让 Chrome 在后台运行
- CCIE试验备考之交换VLAN间路由
- 台式计算机前面插耳机没声音,Win10台式机机箱前置耳机插孔没声音如何修复
- 航空机场三字码和航空公司二字码
- 2007最新最强杀毒软件破解大全
- 【VS开发】ClientToScreen 和ScreenToClient 用法
- oracle中distance用法,distance的用法总结大全
- 麒麟子Cocos Creator实用技巧
- 洛谷 P4147 玉蟾宫【悬线法/单调栈】