PHP中PSR-[0-4]规范

本文详细介绍了PHP中的PSR-[0-4]编码规范,包括自动加载标准、基础编码标准、编码风格指南、日志接口和自动加载增强版。这些规范由PHP-FIG创建,旨在统一PHP的编码风格,提高代码可读性和互操作性。文章首先解释了PHP-FIG的背景,然后逐一解析了PSR-0到PSR-4的各个要点,如命名空间、自动加载、类命名和代码格式等。
摘要由CSDN通过智能技术生成


PHP中PSR-[0-4]规范

更好排版:https://www.zybuluo.com/phper/note/65033


PHP是世界上最伟大的语言,这一点是毋庸置疑的吧。哈哈哈哈哈哈 。这个霸气的开头不错!(^__^)

但是正是因为伟大,所以用的人也就多了,人一多,再牛逼再伟大的东西,都会产生问题,逐渐就造成了很多的分歧。每个人的习惯不一样,所以在一些PHP语法上的一些表现也是千差万别,比如这些问题:

function 函数名是否驼峰命名, 
花括号{}是否换行写, 
是该写注释呢还是不写 
变量名是大写还是小写, 
一个php文件中是一个类好还是允许有多个

等等一系列的问题,接踵而至,你说你的这种方式屌,我说你傻逼啊我的才好。所以。各种争执声此起彼伏。

特别是当你去接手上任留下的坑的时候,如果你有自己的规范或者你是处女座,你就会骂死那个狗日的一万遍了,每改一次就会改一遍骂:“麻痹的写的都是什么狗shit烂代码啊”。所以,在PHP程序员的心中一个共有的心愿诞生了:“能不能他妈的大家都遵守同一规范啊”。

好,既然大家都有共同的心声,那么这样一个的公共的规范就出来了,他就是PSR-[0-4]规范,它出来后,大家都觉得挺不错的啊,还蛮符合自己的书写风格的,渐渐的大家都知道了它,也慢慢的接受了它,越来越多的人知道了它,一些大牛的项目都慢慢的遵守了这个规范,然后也一帮菜鸟一看大牛都在用这个规范,我为啥不也尝试着规范一下呢?

所以,渐渐的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规范,分别是:

PSR-0 (Autoloading Standard) 自动加载标准 
PSR-1 (Basic Coding Standard) 基础编码标准 
PSR-2 (Coding Style Guide) 编码风格向导 
PSR-3 (Logger Interface) 日志接口 
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已!经!过!时!了!,别哭,PHP代码狗。虽说已经过时,但是我们也可以看看嘛,这不影响我们的学习,好了。废话不说了,开始吧:

PSR-0强制性要求几点:

  1. 一个完全合格的namespace和class必须符合这样的结构:“\< Vendor Name>(< Namespace>)*< Class Name>”
  2. 每个namespace必须有一个顶层的namespace("Vendor Name"提供者名字)
  3. 每个namespace可以有多个子namespace
  4. 当从文件系统中加载时,每个namespace的分隔符(/)要转换成 DIRECTORY_SEPARATOR(操作系统路径分隔符)
  5. 在类名中,每个下划线(_)符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线(_)符号是没有(特殊)意义的。
  6. 当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的
  7. verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)

是不是有点看不懂啊。什么namespace啊,什么autoloading啊。所以,如果你对命名空间还不是特别懂的话,可以google下namespace 和 自动加载相关的php知识。或者看下一篇,我专门来讲讲他们:namespace 和 autoloading

好,我们接着一条条举例来分析下:

第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

在Linux下就去严格按照大小写去找目录和文件了。但是如果你在windows下开发,全是小写也不会报错,你一发布到Linux上就悲剧了,提示找不到文件。所以,大小写太重要了。

PSR-1 规范

还是那句话,如果你英文比较好,可以直接看官网的这个: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条

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值