psr规范
psr规范
PSR是由FIG这个组织制定的PHP规范,官网是 www.php-fig.org
1、PSR-0:自动加载
PSR-0 是FIG出的第一套规范,主要是制定了一些自动加载标准。不过 PSR-0 已经被标记为 Deprecated(已弃用),自动加载的新规范为 PSR-4
在Composer中,遵循PSR-0标准的典型目录结构是这样的:
1 // psr0 规范 2 3 vendor/ 4 vendor_name/ 5 package_name/ 6 src/ 7 Vendor_Name/ 8 Package_Name/ 9 ClassName.php # Vendor_Name\Package_Name\ClassName 10 tests/ 11 Vendor_Name/ 12 Package_Name/ 13 ClassNameTest.php # Vendor_Name\Package_Name\ClassNameTest
可以看到目录结构有明显的重复而且层次很深。src/和test/目录又重新包含了Vendor和Package目录。
2、PSR-1:基本代码规范
PSR-1 规范包括了一些为确保共享PHP代码之间高水平的技术互操作性所需的标准编码元素。
PHP源文件必须只使用<?php和<?=这两种标签。
源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8。
一个源文件建议只用来做声明(类、函数、常量等)或者只用来做一些引起副作用的操作(例如:输出信息、修改.ini配置等),但不建议同时做这两件事。
命名空间(namespace)和类(class)必须遵守PSR-0/PSR-4自动加载标准。
类名必须使用骆驼式(StudlyCaps)写法 (注:驼峰式的一种变种)。
类中的常量必须只由大写字母和下划线组成。
方法名必须使用驼峰式(camelCase)写法。
3、PSR-2:代码样式
PSR-2 是对 PSR-1 规范的补充和扩展,主要是用于约束代码风格,多人协作开发时统一代码风格是很重要的。
代码必须遵循 PSR-1 的基本代码规范。
必须使用4个空格来缩进,不能使用Tab键。
一行代码的长度不得有硬性限制,软限制必须是120字符,建议是最多80个字符。
在namespace声明之后必须有一个空行,并且在use声明块之后必须有一个空行。
声明类、方法的花括号必须单独写在一行。
必须在所有属性和方法上声明可见性(public/protected/private),abstract和final必须在可见性之前声明,static必须在可见性之后声明。
控制结构关键字,就是 if else while switch foreach等,后面必须要有一个空格。
控制结构的左花括号必须与控制关键字在同一行,右花括号必须单独写在一行。
3、PSR-3:日志接口
PSR-3 规范描述的是日志库的通用接口,主要目标是允许库以简单和通用的方式接收Psr\Log\LoggerInterface对象并将日志写入其中。
Basics
接口LoggerInterface暴露了8个方法,用于写8种级别的日志,包括debug,info,notice,warning,error,critical,alert,emergency。
第九个方法log($level, $message, $context),根据$level参数调用特定日志级别的方法,如果传入的日志 level 不存在,必须抛出一个Psr\Log\InvalidArgumentException异常。
Message
每个方法都接受一个字符串作为消息,或一个带有__toString()方法的对象。实现者可以对该入参进行特殊处理,最后必须都转换为字符串。
$message中可以包含占位符,实现时可以用$context数组中的值替换。
占位符名称必须是$context数组中的键;
占位符必须用花括号{}括起来,占位符名称与花括号之间不能再有空格;
占位符名字应该只由大小写字母、数字、下划线、点组成。
Context
每个方法都接受一个$context数组作为上下文数据,该数组可以包含任何内容。
4、PSR-4:自动加载
PSR-4 规范了如何从文件路径自动加载类,同时规范了自动加载文件的位置。
术语class指的是类,接口,trait,和其他类似结构。
遵循PSR4规范的目录结构是这样的:
1 //PSR4 规范 2 3 vendor/ 4 vendor_name/ 5 package_name/ 6 src/ 7 ClassName.php # Vendor_Name\Package_Name\ClassName 8 tests/ 9 ClassNameTest.php # Vendor_Name\Package_Name\ClassNameTest
可以看到目录结构更加简洁了。
在PSR-0中目录结构要与命名空间层层对应,无法插入一个单独的目录。Vendor\Package\Class在psr-0会里被直接转换成同样的路径,而PSR-4则没有这样的强制要求。
对比PSR-0,除了PSR-4可以更简洁外,需要注意PSR-0中对下划线(_)是有特殊的处理的,下划线会转换成DIRECTORY_SEPARATOR,这是出于对PHP5.3以前版本兼容的考虑,而PSR-4中是没有这个处理的,这也是两者比较大的一个区别。
1) 一个完整的类名需具有以下结构:
\<命名空间>\<子命名空间>\<类名>
- 完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace"
- 完整的类名可以有一个或多个子命名空间
- 完整的类名必须有一个最终的类名
- 完整的类名中任意一部分中的下滑线都是没有特殊含义的
- 完整的类名可以由任意大小写字母组成
- 所有类名都必须是大小写敏感的
2)根据完整的类名载入相应的文件
- 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为「命名空间前缀」,其必须与至少一个「文件基目录」相对应;
- 紧接命名空间前缀后的子命名空间 必须 与相应的「文件基目录」相匹配,其中的命名空间分隔符将作为目录分隔符。
- 末尾的类名必须与对应的以 .php 为后缀的文件同名。
- 自动加载器(autoloader)的实现一定不可抛出异常、一定不可触发任一级别的错误信息以及不应该有返回值。
5、控制结构
- 控制结构的关键词之后必须有一个空格。
- 控制结构的左括号之后不可有空格。
- 控制结构的右括号之前不可有空格。
- 控制结构的右括号和左花括号之间必须有一个空格。
- 控制结构的代码主体必须进行一次缩进。
- 控制结构的右花括号必须在主体的下一行。
6、if,elseif,else
下面是一个if条件控制结构的示例,注意其中括号,空格和花括号的位置。同时注意else和elseif要和前一个条件控制结构的右花括号在同一行。
1 <?php 2 3 if ($expr1) { 4 // if body 5 } elseif ($expr2) { 6 // elseif body 7 } else { 8 // else body; 9 }
通常还有以下几点需要注意
对于php文件:
所有的php文件都必须以Unix LF(换行)作为结束符
所有的php文件都必须以一个单独的空行结尾
纯PHP代码源文件的关闭标签?>必须省略。
关键字和 True/False/Null
php的关键字,必须小写
php产量 true ,false,null也必须小写
命名空间
命名空间(namespace)的声明后面必须有一行空行。
所有的导入(use)声明必须放在命名空间(namespace)声明的下面。
一句声明中,必须只有一个导入(use)关键字。
在导入(use)声明代码块后面必须有一行空行。
7、IDE中的格式化
可以通过在PhpStorm中配置,快速格式化,现在基本都遵循PSR-12的规范(最好是phpstorm2020.1以上的版本,之前的版本只能配置PSR1/PSR2)
目前,psr规范已经更新到psr18,主要是定义一些在开发composer第三方扩展库所需要遵循的规范:
参考链接:
https://learnku.com/docs/psr
https://blog.csdn.net/lisonglisonglisong/article/details/81238893
https://blog.csdn.net/zhaoxuejie/article/details/52242140
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)