PHP-PSR 现代PHPer的开发规范
PSR是PHP Standards Recommendation的简称,意为PHP推荐标准。要想了解PSR,首先得知道制定这一标准的人/组织是谁————PHP-FIG。
PHP-FIG
PHP-FIG全称为PHP Framework Interop Group,是一个组织,这个组织的成员由一些PHP框架的代表组成,这些人聚在一起“讨论框架之间的共性,寻找可以合作的方式”。PHP-FIG制订了推荐规范,PHP框架可以自愿实现这些规范,改进其他框架的通信和共享功能。
PHP-FIG的使命是实现框架之间的互操作性。
PSR-1:基本的代码风格
在文章的最开始,我们就已经简单介绍过什么是PSR,PSR是PHP标准,而PSR-1是PHP最基本也是最简单的标准。
PHP标签
必须把代码放在<?php ?>或<? ?>标签中。不得使用其它的标签句法
这点相信很多PHPer都很容易遵守,而且在现实撸代码中一般都是采用正常的<?php ?>
标签
编码
所有PHP文件都必须使用UTF-8字符集编码,而且不能有字节顺序标记(Byte Order Mark,BOM)
这个也很常见,就是无BOM和有BOM格式,记得刚开始敲PHP代码的时候,前辈总是很关照,一定要用IDE调成无BOM格式啊,当时表示懵懂,然后就跟着做了,现在看到这里,又重新查了资料,找到了为什么不能使用有BOM格式的原因,BOM会产生多余的输出,就像平白无故多了一个空行:
php在处理BOM头的时候,有时候存在错误,可能造成你在使用 header 或 session_start 之类的函数时,出现 文件已经输出的错误,多数都是因为BOM头送出去了。。因为在php看来,成了一个空格。所以使用无BOM的格式
目的
一个PHP文件可以定义符号(类、性状、函数、常量等),或者执行有副作用的操作(生成结果或者处理数据),但不能同时做两件事
这个规定的意思差不多就是一个变量、方法或者一个类,只能相应完成一个操作、做一件事情,这样保证了代码的清晰易懂,也保证了方法、变量的单一性,各司其职。其实也是为了方便,我们在以后项目/应用较大时,可以很好的解耦
自动加载
PHP的命名空间和类必须遵守PSR-4自动加载器标准
后续看PSR-4的具体解释
类的名称
PHP类的名称必须使用驼峰式,又名标题式
驼峰式和分词式(每个单词用_隔开)这两种写法,记得以前存在很大的争议,有人支持驼峰(GirlFriend),有人支持分词式(girl_friend),现在好了,统一规定出来了,为了PHP更好的发展,那就委屈支持分词式的兄弟,统一驼峰了。记得公司的CI2项目,用的就是这种分词式,不过也是框架规定,后来在自己的项目中,自己有预感的使用了驼峰式,哈哈,为自己的眼光点赞~
常量的名称
PHP的常量名称必须大写;
这点应该是毋庸置疑的吧,最开始写PHP的时候,这个写法已经根深蒂固了。
方法的名称
使用驼峰式(boyFriend)
方法的命名和类的命名方式有些相似,不过还是有些区别:类的命名规定首字母大写(BoyFriendMoney),而方法的命名规定首字母小写(boyFriendMoney)
PSR-2:严格的代码风格
PSR-2 相较于PSR-1是更为严格的代码规范。个人和官方都认为开发者应该遵循更为严格的代码标准,在现代的PHP生态系统中,风格统一,可以更好的让其他开发者理解PHP代码。
贯彻PSR-1
使用PSR-2 之前先要贯彻PSR-1
缩进
使用四个空格缩进。
关于缩进这个问题,相信有很多争议。我在真正正视这个问题之前,一直使用的都是IDE的tab键。然后当同事和自己在编写同一文件的时候,就会出先代码缩进不一的情况,导致代码结构非常乱。所以在出现这个问题之后,就统一了一下文件缩进的标准,以四个空格为缩进。这样的话,就算是用不一致的编辑器打开,效果也是一样的。
很多IDE都可以设置tab键,百度一下就可以搜到。
文件和代码行
PHP文件必须使用UNIX风格的换行符(LF),最后要有一个空行,而且不能使用PHP关闭 ?> 标签。
最开始我也不懂为什么在纯PHP页面中不使用关闭 ?>
标签,后来在书中找到了答案
为了避免意料之外的输出错误,如果加上关闭标签,而且在关闭标签后有空行,那么这个空行也被当成输出,导致错误(例如,设定http首部时)
关键字
关键字,要使用小写;
之前不知道在哪儿看的PHP的教程,上面写的PHP代码像true
、false
这样的关键字都使用的是大写TRUE
、FALSE
,我也一直在这样使用,后来看到PSR-2的规范,才知道应该要使用小写,心累~
命名空间
每个命名空间语句后必须跟着一个空行。类似的,使用use关键字导入命名空间或为命名空间创建别名时,在一系列use声明语句后要加一个空行
类似于:
<?php
// 声明本文件的命名空间
namespace My\Friend; // 导入命名空间
use Other\Friend; class GirlFrined
{ }
类
类定义体的起始括号应在类名之后另起一行写;
类定义体的结束括号必须在定义体之后新起一行写;
例:
<?php class Frined
{
public function getSex()
{
// do something
}
}
方法
方法定义体的起始括号应在方法名之后另起一行写;
方法定义体的结束括号必须在方法定义体之后新起一行写;
请参考上面类示例中方法的例子。
可见性
1、类中的每个属性和方法都要声明可见性。可见性由public、protected或者private指定,其作用是决定在类的内部和外部如何访问属性的方法。
2、私有方法的名称前加上下划线
3、如果类属性声明为abstract和final,这两个限定符必须放在可见性关键字之前
4、如果属性、方法声明为static,这个限定符必须放在可见性关键字之后
例子:
// 1、2
public $sex;
private $_sex;
protected $sex; // 3、
abstract public $sex;
final public $sex; // 4、
public static $sex;
public static $age;
控制结构
所有控制结构关键字后面都要有一个空格。控制结构关键字包括:if、elseif、else、switch、case、while、do while、for、foreach、try、catch。如果控制结构关键字后面有一对圆括号,起始圆括号后面不能有空格,结束圆括号之前不能有空格。与类和方法的定义体不同,控制结构关键字后面的起始括号应该和控制机构关键字写在同一行。控制结构关键字后面的结束括号必须写在单独一行。
例:
/**
* 错误的示例:
* 这里有4个错误:
* 1、if关键词后面和圆括号之前没有空格
* 2、圆括号前后有空格
* 3、后圆括号和起始括号之前没有空格
* 4、else关键词前后没有空格
**/
if( 1 == true ){
// do something
}else{
// do something
} /**
* 正确的示例:
**/
if (1 == true) {
// do something
} else {
// do something
}
PSR-3:日志记录器接口
日志记录器
PHP-FIG发布的第三个推荐规范和前两个不同,这个有点特殊,是一个接口。规定PHP日志记录器组件可以实现的方法。
日志记录器是对象,用于把不同重要程度的消息写入指定的输出。记录的消息用于诊断、检查和排除应用中的操作、稳定性和性能方面的问题。例如:开发的时候把调试信息写入到文本文件,把网站的流量统计信息记录到数据库等。
相信基本上所有的框架中都实现了日志功能,那么如果想要使用PSR-3规范的日志记录器,该怎么做呢?首先要满足两点:
日志功能委托给第三方库实现
最终用户能选择他们喜欢的日志记录器组件
编写PSR-3日志记录器
符合PSR-3推荐规范的PHP日志记录器组件,必须包含一个实现Psr\Log\LoggerInterface接口的PHP类。PSR-3接口复用了RFC 5424系统日志协议,规定要实现9个方法:
下面的代码是我从PHP-FIG的官网上拿过来的.
<?php namespace Psr\Log; interface LoggerInterface
{ public function emergency($message, array $context = array());
public function alert($message, array $context = array());
public function critical($message, array $context = array());
public function error($message, array $context = array());
public function warning($message, array $context = array());
public function notice($message, array $context = array());
public function info($message, array $context = array());
public function debug($message, array $context = array());
public function log($level, $message, array $context = array());
}
这个类中的每一个方法都对应RFC 5424协议的一个日志级别,而且都接受两个参数。第一个参数必须是一个字符串,或者有一个__toString()方法的对象。第二个参数为数组,可选参数;
如果要编写符合PSR-3规范的日志记录器,那么就要创建一个实现Psr\Log\LoggerInterface接口的PHP类,而且要提供这个接口中每个方法的具体实现
使用PSR-3日志记录器
PSR-3规范出来之后,达到这种效果的组件太多了,这里就不介绍,如何实现这个接口的类了。现在有成熟的日志记录器组件,推荐monolog/monolog。这个组件完全上线了PSR-3的接口,而且可以使用自定义的消息格式化程序和处理程序扩展功能。
如果monolog满足不了日常的使用,我们可以在此基础上拓展自己的方法,也非常简单;
使用monolog示例:
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler; // 准备日志记录器
$logger = new Logger('my_logger');
$logger->pushHandler(new StreamHandler('logs/development.log', Logger::DEBUG));
$logger->pushHandler(new StreamHandler('logs/production.log', Logger::WARNING));
// 使用日志记录器
$logger->debug('This is debug message');
$logger->debug('This is warning message');
PSR-4:自动加载器
PHP-FIG发布的第四个推荐规范描述了一个标准的自动加载器策略;自动加载器的意思就是指在程序运行时按需查找PHP类、接口(interface)或性状(trait)并将其载入加载器。
自动加载器策略
PSR-4推荐规范不要求改变代码的实现方式,只建议如何使用文件系统目录结构和PHP命名空间组织代码。PSR-4**依赖**
PHP命名空间和文件系统目录结构查找并加载PHP类、性状和接口
为什么自动加载器很重要
举一个很常见的场景,我们引入文件通常都是采用require、include这样的方法,这样的方式简单也可靠,但是如果我们引入一两个还好说,但是当我们一个项目运行时需要引入几十个文件呢,那我们岂不是要写几十个require或者include?这样既不方便,又不美观,所以PHP-FIG在此基础上考虑,规范了一个统一的自动加载器策略;
如何使用自动加载器
建议使用依赖管理器Composer自动生成的PSR-4自动加载器。
现代的PHP框架,laravel、Yii、TP5等都使用了依赖Composer的自动加载器策略,方便我们下载组件和引入合适的类。
PSR-ME:制定自己的PHP规范
- 遵循PSR-1、PSR-2的使用规范
- 合适、精简的变量、方法、类命名。能让人看一眼就清楚是做什么的
- 尽量编写出高内聚、低耦合的代码
- 保持代码结构整洁、美观
总结
PHP-FIG推出的PHP规范,并不一定说所有的PHP开发者必须遵守。制定这一规范的目的就是为了,在全世界的PHP开发者在查看代码的时候,能更加简单和轻松。造出来的组件/轮子可以很容易的就被所有开发者熟知和使用,同时也减少了我们的工作投入率,得到更大的工作效率,使产出大于投入,效率更高更快。
PHP-PSR 现代PHPer的开发规范的更多相关文章
- php开发规范-psr系列规范
转自:http://www.cnblogs.com/x3d/p/php-psr-standards.html PSR 是PHP Standard Recommendation的简写,它其实应该叫PSR ...
- 【PHP开发规范】继承与扩展:PSR-2 编码风格规范
之前的一篇文章是对PSR-1的基本介绍 接下来是PSR-2 编码风格规范,它是 PSR-1 基本代码规范的继承与扩展. PSR-1 和PSR-2是PHP开发中基本的编码规范,大家其实都可以参考学习下, ...
- 【PHP开发规范】老生常谈的编码开发规范你懂多少?
[PHP开发规范]老生常谈的编码开发规范你懂多少? 这几天看了一下阿里技术发布的一套Java开发规范<阿里巴巴Java开发手册>,里面写了阿里内部的Java开发规范标准,写的很好.这套Ja ...
- PSR-PHP开发规范(本文版权归作者:luluyrt@163.com)
遵循PSR-4的自动加载 一.简介 首先这里要了解PSR,Proposing a Standards Recommendation(提出标准建议)的缩写,就是一种PHP开发规范,让我们研发出来的代码更 ...
- PHP开发规范1.3.3
PHP 开发规范1.3.3 一.编程规约 (一) 命名风格 [强制]代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式. 说明: 正确的英文拼写和语法可以让阅读者易于理解,避免歧义. ...
- 我的公司培训讲义(1):.NET开发规范教程
这是1年多以前我在公司所做讲座的讲义,现在与园友们分享,欢迎拿去使用.一起讨论.文中有若干思考题,对园友们是小菜一碟.另有设计模式讲义一篇,随后发布.博文上了首页,感谢博客园团队推荐,也感谢所有园友的 ...
- 转载:移动web开发规范
本文来源:http://blog.csdn.net/joueu/article/details/44329825 以下是规范建议,均是日常在开发当中的的一些经验,仅供参考. 移动web开发规范 一.头 ...
- php与数据库代码开发规范
php与数据库代码开发规范 1/25/2016 6:00:31 PM php对各类变量命名规范 目录名 文件命名 局部变量命名 使用英文动词名词,用下划线作为单词的分割,所有字母均使用小写 目录 up ...
- 【敏捷开发】Android团队开发规范
这里说的开发规范分成目录规范,项目和包名的命名规范,类,方法,变量和常量的命名规范这几种. 目录规范 目录规范——在开发中整体文件夹组织结构. Requirement——需求文档文件夹 Design— ...
随机推荐
- RegExp实现字符替换
将字符串组中的所有Paul替换成Ringo,g:执行全局匹配,查找所有匹配而非在找到第一个匹配后停止;\b:匹配单词边界,划分匹配字符的起始范围 <!DOCTYPE html> <h ...
- 为什么要学3D建模呢?你看中的肯定是这几点
游戏行业的大环境 互联网的形态一直以来都是2D模式的,但是随着3D技术的不断进步,在未来的5年时间里,将会有越来越多的互联网应用以3D的方式呈现给用户,包括网络视讯.电子阅读.虚拟社区.网络游戏.电子 ...
- WPF中的文本度量
关于WPF中的文本度量,需要了解以下几个问题: WPF中支持一些常用的度量单位:px(device independent pixels).in(inches).cm(centimeters).pt( ...
- vue系列---理解Vue中的computed,watch,methods的区别及源码实现(六)
_ 阅读目录 一. 理解Vue中的computed用法 二:computed 和 methods的区别? 三:Vue中的watch的用法 四:computed的基本原理及源码实现 回到顶部 一. 理解 ...
- 史上最轻松入门之Spring Batch - 轻量级批处理框架实践
从 MariaDB 一张表内读 10 万条记录,经处理后写到 MongoDB . Batch 任务模型 具体实现 1.新建 Spring Boot 应用,依赖如下: <!-- Web 应用 -- ...
- Spring Cloud zuul网关服务 一
上一篇进行Netflix Zuul 1.0 与 gateway的对比.今天来介绍一下 zuul的搭建及应用 Zuul 工程创建 工程创建 cloud-gateway-zuul.还是基于之前的工程 po ...
- 深入理解JavaScript中的作用域、作用域链和闭包
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qappleh/article/detai ...
- <编译原理 - 函数绘图语言解释器(1)词法分析器 - python>
<编译原理 - 函数绘图语言解释器(1)词法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 解释器分为三个实现块: 词法分析器: ...
- OptimalSolution(1)--递归和动态规划(1)斐波那契系列问题的递归和动态规划
一.斐波那契数列 斐波那契数列就是:当n=0时,F(n)=0:当n=1时,F(n)=1:当n>1时,F(n) = F(n-1)+F(n-2). 根据斐波那契数列的定义,斐波那契数列为(从n=1开 ...
- 设计模式(九)Bridge模式
Bridge模式就是将类的功能层次结构和类的实现层次结构连接起来. 类的功能层次结构就是根据实际非抽象类来说的,也就是父类具有基本功能,然后在子类中增加新功能.用于增加新功能. 类的实现层次结构就是根 ...