原文是在我本身博客中,小伙伴也能够点阅读原文进行跳转查看,还有好听的背景音乐噢~php
PSR是PHP Standards Recommendation的简称,意为PHP推荐标准。要想了解PSR,首先得知道制定这一标准的人/组织是谁————PHP-FIG。html
PHP-FIG全称为PHP Framework Interop Group,是一个组织,这个组织的成员由一些PHP框架的表明组成,这些人聚在一块儿“讨论框架之间的共性,寻找能够合做的方式”。PHP-FIG制订了推荐规范,PHP框架能够自愿实现这些规范,改进其余框架的通讯和共享功能。laravel
PHP-FIG的使命是实现框架之间的互操做性。数据库
在文章的最开始,咱们就已经简单介绍过什么是PSR,PSR是PHP标准,而PSR-1是PHP最基本也是最简单的标准。数组
必须把代码放在
<?php ?>
或<? ?>
标签中。不得使用其它的标签句法session
这点相信不少PHPer都很容易遵照,并且在现实撸代码中通常都是采用正常的<?php ?>
标签composer
全部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-1是更为严格的代码规范。我的和官方都认为开发者应该遵循更为严格的代码标准,在现代的PHP生态系统中,风格统一,能够更好的让其余开发者理解PHP代码。
使用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 } }
方法定义体的起始括号应在方法名以后另起一行写;
方法定义体的结束括号必须在方法定义体以后新起一行写;
请参考上面类示例中方法的例子。
一、类中的每一个属性和方法都要声明可见性。可见性由public、protected或者private指定,其做用是决定在类的内部和外部如何访问属性的方法。
二、私有方法的名称前加上下划线
三、若是类属性声明为abstract
和final
,这两个限定符必须放在可见性关键字以前
四、若是属性、方法声明为static
,这个限定符必须放在可见性关键字以后
例子:
// 一、2 public $sex; private $_sex; protected $sex; // 三、 abstract public $sex; final public $sex; // 四、 public static $sex; public static $age;
全部控制结构关键字后面都要有一个空格。控制结构关键字包括:
if
、elseif
、else
、switch
、case
、while
、do while
、for
、foreach
、try
、catch
。若是控制结构关键字后面有一对圆括号,起始圆括号后面不能有空格,结束圆括号以前不能有空格。与类和方法的定义体不一样,控制结构关键字后面的起始括号应该和控制机构关键字写在同一行。控制结构关键字后面的结束括号必须写在单独一行。
例:
/** * 错误的示例: * 这里有4个错误: * 一、if关键词后面和圆括号以前没有空格 * 二、圆括号先后有空格 * 三、后圆括号和起始括号以前没有空格 * 四、else关键词先后没有空格 **/ if( 1 == true ){ // do something }else{ // do something } /** * 正确的示例: **/ if (1 == true) { // do something } else { // do something }
PHP-FIG发布的第三个推荐规范和前两个不一样,这个有点特殊,是一个接口。规定PHP日志记录器组件能够实现的方法。
日志记录器是对象,用于把不一样重要程度的消息写入指定的输出。记录的消息用于诊断、检查和排除应用中的操做、稳定性和性能方面的问题。例如:开发的时候把调试信息写入到文本文件,把网站的流量统计信息记录到数据库等。
相信基本上全部的框架中都实现了日志功能,那么若是想要使用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规范出来以后,达到这种效果的组件太多了,这里就不介绍,如何实现这个接口的类了。如今有成熟的日志记录器组件,推荐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');
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的自动加载器策略,方便咱们下载组件和引入合适的类。
以上内容均来自《Mordern PHP》,中文名为现代PHP,书中详细的介绍了在现代化PHP开发中的新特性和良好实践,很是好的一本书。PHP-FIG推出的PHP规范,并不必定说全部的PHP开发者必须遵照。制定这一规范的目的就是为了,在全世界的PHP开发者在查看代码的时候,能更加简单和轻松。造出来的组件/轮子能够很容易的就被全部开发者熟知和使用,同时也减小了咱们的工做投入率,使产出大于投入,效率更高更快。