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

posted @ 2020-11-11 10:30  欢乐豆123  阅读(529)  评论(0编辑  收藏  举报