您的位置:首页 > 编程语言 > PHP开发

PHP中PSR-[0-4]标准代码规范

2017-11-10 20:33 267 查看
作为一个程序员能写出牛逼的代码我感觉那不是真正的牛逼,真正牛逼的代码应该是让其他程序员可以很轻易的看懂,能让接受你代码的人可以很轻松的上手那才是真正的牛逼!能够让那些接受你代码的人对你的评价都是称赞那是作为一个程序员的骄傲!而一个规范标准的代码格式应该作为一个最基础的基本功来要求一个程序员!

就因为对代码标准的看重所以出现了组织,他们定义了一套规范的代码书写格式,并且被大家所认可,所以一些牛人以及越来越多的程序员慢慢的接受了它,并且按照这个标准来开发他们的项目!

渐渐的PSR-[0-4]规范成为了PHP的一个王牌规范,你写PHP就最好必须按照这里面的规范写,全球共享好代码。

PHP-FIG

在说什么是PSR-[0-4]规范的之前,我觉得有必要说下它的发明者和规范者,这也是对他们成果的尊重:
PHP-FIG
,它的网站是:www.php-fig.org。就是这个联盟组织发明和创造了PSR-[0-4]规范!

FIG
Framework Interoperability Group
(框架可互用性小组)的缩写,由几位开源框架的开发者成立于 2009 年,从那开始也选取了很多其他成员进来,虽然不是 “官方” 组织,但也代表了社区中不小的一块。组织的目的在于:以最低程度的限制,来统一各个项目的编码规范,避免各家自行开发的风格阻碍了程序设计师开发的困扰,于是这个团队发明和总结了
PSR
PSR
Proposing a Standards Recommendation
(提出标准建议)的缩写,截止到目前为止,总共有5套PSR规范,分别是:

1. PSR-0 (Autoloading Standard) 自动加载标准
2. PSR-1 (Basic Coding Standard) 基础编码标准
3. PSR-2 (Coding Style Guide) 编码风格向导
4. PSR-3 (Logger Interface) 日志接口
5. PSR-4 (Improved Autoloading) 自动加载的增强版,可以替换掉PSR-0了。


接下来的篇目,会针对这5套,深入了解。仔细学习下受万千PHPer热捧的这5套规范到底有什么出众之处。

PSR-0 规范

PRS-0规范是他们出的第1套规范,主要是制定了一些自动加载标准(Autoloading Standard),如果你英文比较好,可以直接看官网的这个:PSR-0,很短。

我们打开PSR-0的主页时,发现多了一个警告:

Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated. PSR-4 is now recommended as an alternative.


翻译过来就是:不推荐使用 - 在2014年10月21日PSR-0已被标记为过时。PSR-4现在推荐作为替代。

那么也就是说PSR-0已经过时了!虽说已经过时,但是还是建议看一看,这不影响我们的学习!

PSR-0强制性要求几点:

一个完全合格的namespace和class必须符合这样的结构:“\< Vendor Name>(< Namespace>)*< Class Name>”

每个namespace必须有一个顶层的namespace(”Vendor Name”提供者名字)

每个namespace可以有多个子namespace

当从文件系统中加载时,每个namespace的分隔符(/)要转换成 DIRECTORY_SEPARATOR(操作系统路径分隔符)

在类名中,每个下划线()符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线()符号是没有(特殊)意义的。

当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的

verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)

如果有点看不懂,什么是namespace,什么是autoloading。可以google下namespace 和 自动加载相关的php知识。

我们来一条条举例分析下:

第1条

比如 /Doctrine/Common/IsolatedClassLoader .php 这样的一个类文件,那么你的namespace命名就必须声明称这样:

声明:namespace  \Doctrine\Common\
调用:\Doctrine\Common\IsolatedClassLoader


其中,Doctrine 表示一个模块目录 Vendor name, common就是namesapce, IsolatedClassLoader 是class name。这样一看就知道这个文件的目录层次,一目了然。

再比如:/path/to/project/lib/vendor/Symfony/Core/Request.php 文件:

声明:namespace \Symfony\Core
调用:\Symfony\Core\Request


第2,3条

namespace \Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
namespace \Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php


必须有一个顶级的zend的namespace, zend 下面可以有message子命名空间。

第4条

看这个例子,我们需要new 一个这样的类

new \Symfony\Core\Request


那么我再加载这个类文件时候,就要将分隔符\ 转换成 目录,也就是去 Vendor -> Symfony->Core->Request.php 一层层的目录找到这个文件。其实也就是和第1,2,3是反过来的对应关系。

第5条

第5条是说namespace命名中的这个
_
符号 没有任何用处,就是用来表示目录分隔符的,但是注意在PRS-4中已经取消了这个_ ,那么我们还是看一下,这个过时的规定是怎么样的:

\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php

\namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php


以上2个namespace中的_ 其实是目录分隔符。并不是class name就是那样的。现在PSR-4出来后,确实觉得这样的规定有点不好,怪怪的。

第6条

第6条不用多说。既然你用php,文件名当然是得用.php 后缀结尾。这个规定的原因,估计是有人用 .php3 后缀,因为在apache的配置文件中是允许的:

<IfModule dir_module>
DirectoryIndex index.php index.php3 index.html index.htm
</IfModule>


所以,还是严格用.php作为后缀名吧。

第7条

文件大小写的问题,这个其实是很重要的。因为Linux系统下是区分文件名和目录名大小写的,而在Windows下是不区分的。所以就会经常出现问题,比如:

namespace  \Doctrine\Common\IsolatedClassLoader
```[这里写链接内容](http://www.php-fig.org/psr/psr-0/)
在Linux下就去严格按照大小写去找目录和文件了。但是如果你在windows下开发,全是小写也不会报错,但是当你一发布到Linux上就悲剧了,提示找不到文件,我曾经就犯过这个错误。所以,大小写太重要了,按照Linux要求来严格要求自己。

<div class="se-preview-section-delimiter"></div>

PSR-1 规范
--------

1. PHP源文件必须只使用 `<?php ?>` 和 `<?= ?>` 这两种标签。
2. 源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8。
3. 一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
4. 命名空间(namespace)和类(class) 必须遵守PSR-0标准。
5. 类名(class name) 必须使用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
6. 类(class)中的常量必须只由大写字母和下划线(_)组成。
7. 方法名(method name) 必须使用驼峰式(cameCase)写法。

上面的基本7大点,有些很简单,就不过多说明,第3点需要仔细说下。

**第1条**

这个基本都是大家都懂得的,PHP代码必须只使用长标签(`<?php ?>`)或者短输出式标签(`<?= ?>`);而不要使用其他标签。
之所以说这个,是因为我们在学习PHP的时候,一般的教材都告诉我们说,php有4种标记风格: 所以,很多人就乱来了。

**第2条**

这个不多说,保存的时候格式必须是无BOM的UTF-8格式,否则会出现很多无法解释的千奇百怪的问题。千万别用Windows下的text文本编辑器保存文件。

**第3条**

这个通俗的说呢。就是别把一些输出和修改的操作(副作用) 和 类文件混合在一起,专注一点,这个文件专门来声明Class, 那个文件专门来修改配置文件,别混在一起写:
所以,以下的这个文件是有问题的,最好不要这样:

<div class="se-preview-section-delimiter"></div>


// 副作用:修改了ini配置

ini_set(‘error_reporting’, E_ALL);

// 副作用:载入了文件

include “file.php”;

// 副作用:产生了输出

echo “\n”;

// 声明 function

function foo()

{

// 函数体

}

上面看起来很乱。最好全部分开来写:

<div class="se-preview-section-delimiter"></div>


namespace Lib;

class Name

{

public function __construct()

{

echo NAMESPACE . “
”;

}

public static function test()
{
echo __NAMESPACE__ . ' static function test <br>';
}


}

修改ini:

<div class="se-preview-section-delimiter"></div>


ini_set(‘error_reporting’, E_ALL);

require 文件:

<div class="se-preview-section-delimiter"></div>


require DIR . ‘/loading.php’;

spl_autoload_register(“\AutoLoading\loading::autoload”);

现在应该看起来整齐多了吧。当然这个是很难约束的,自己仔细划分。

**第4条**

约束namespace,前面已经说过。值得说的是名字要是驼峰方式。

**第5条**

class name必须要用驼峰方式写,驼峰又分小驼峰和大驼峰(小驼峰是第一个字母是小写)这样写看着舒服也比较规范,不做要求,反正是驼峰就可以了。

**第6条**

规定类中的常量名(const)声明必须要全部大写,如果有多个单词,就用_分开:

<div class="se-preview-section-delimiter"></div>


class getUserInfo

{

// 全部大写

const NAME = ‘phper’;

// 用_隔开
const HOUSE_INFO = '已经深圳买房';

public function getUserName()
{
//
}


}​

**第7条**

method name必须要用驼峰方式写,大小驼峰都可以,不做要求:

<div class="se-preview-section-delimiter"></div>

PSR-2 规范
---------

PSR-2 规范的官网链接在此:[http://www.php-fig.org/psr/psr-2](http://www.php-fig.org/psr/psr-2/),PSR-2 这一规范主要是约束代码风格的,可以说是所有里面最关键最重要的,也是需要好好规范和共同遵守的。
本文件中的"必须","不得","要求","应该","不应该","应该","不应该","推荐","可能"按[RFC 2119](http://www.ietf.org/rfc/rfc2119.txt)中的描述进行解释。

概括:

1. 代码必须遵循“编码风格指南”PSR [ PSR-1 ]。
2. 代码必须使用4个空格来缩进,而不是制表符。
3. 在线长度上一定不能是硬性限制。软限制必须是120个字符; 线应该是80个字符或更少。
4. namespace声明之后必须有一个空白行,并且在声明块之后必须有一个空白行use。
5. 类的开放括号必须在下一行,并且在花括号后面的括号必须在下一行。
6. 方法的花括号必须在下一行,并且括号必须在主体后面的下一行。
7. 可视性必须在所有属性和方法上声明; abstract并且 final必须在能见度之前声明; static必须在知名度后宣布。
8. 控制结构关键字之后必须有一个空格; 方法和函数调用禁止。
9. 控制结构的花括号必须在同一行上,并且花括号必​​须在主体后面的下一行上。
10. 控制结构的开括号不能在后面有空格,关闭控制结构的括号之前不能有空格。

**例**
这个例子包含下面的一些规则作为一个快速的概述:

<div class="se-preview-section-delimiter"></div>


PSR-4 规范

PSR-4规范是刚出没多久的一条新的规范,它也是规范 自动加载(autoload)的,是对PSR-0的修改,属于补充规范,

主要是以下几点:

废除了PSR-0中就是目录分割符的写法,下划线在完全限定类名中是没有特殊含义了。

类文件名要以 .php 结尾。

类名必须要和对应的文件名要一模一样,大小写也要一模一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: