PHP 标准推荐 (PSR) 简介

已发表: 2019-12-24

曾几何时,在一次会议上,来自一系列框架的主要开发人员坐在同一个房间里,商定了一些供他们所有项目使用的标准。 目的是使用户更容易组合 PHP 框架和库。 那时 php-fig:PHP 框架互操作组诞生了。 这群很棒的人负责监督 PHP 标准建议 (PSR)。


PHP 标准建议 (PSR) 是 PHP 框架互操作性组 (PHP-FIG) 发布的 PHP 规范。 它服务于 PHP 中编程概念的标准化。 目的是实现组件的互操作性。 PHP-FIG 由几个 PHP 框架创始人组成。

PSR-0 & PSR-4

这些描述了从文件路径自动加载类的规范。 PSR-0 和 PSR-4 都是关于命名空间、类名和文件路径的标准。 此 PSR 还描述了将根据规范自动加载的文件的放置位置。

自动加载

自动加载是一项功能,可帮助开发人员自动包含 PHP 类,而无需在任何地方编写混乱的包含/要求语句。
在 PHP 中,类的定义在它们被调用的文件中加载了 require 或 include 语句,即,在使用它之前,如下所示。

psr 图像 1

上面的方法提出了一些问题,就好像我们有数十个外部类要在一个文件中使用一样,我们就在源文件的开头开始编写 require/include 语句行。

为了解决这个问题,PHP 5 引入了魔术函数 __autoload(),当您的代码引用尚未加载的类或接口时,它会自动调用。

psr图片2

下面是一个基本的 __autoload() 实现的例子:

psr_image3

__autoload() 函数的主要缺点是您只能提供一个自动加载器。 PHP 5.1.2 引入了另一个自动加载函数 (spl_autoload_register) 来应对 __autoload 的限制。

spl_autoload_register() 的引入使程序员能够创建自动加载链,这是一系列可以调用以尝试加载类或接口的函数。

例如:

psr_image4psr_image5

自动加载是一个很棒的想法,以至于每个项目都开始使用它。 由于缺乏统一的标准,每个人都不可避免地创建了自己的自动装载机版本。 显然,PHP 迫切需要一个自动加载器标准,这就是 PSR-0 的诞生方式。 最新接受的自动加载器标准是 PSR-4。

PSR-0(自动加载标准)

PSR-0 概述:

  • 完全限定的命名空间和类必须具有以下结构
    \<供应商名称>\(<命名空间>\)*<类名>
  • 每个命名空间都必须有一个顶级命名空间(“供应商名称”)。
  • 每个命名空间可以有任意数量的子命名空间。
  • 从文件系统加载时,每个命名空间分隔符都会转换为 DIRECTORY_SEPARATOR。
  • CLASS NAME 中的每个 _ 字符都转换为 DIRECTORY_SEPARATOR。 _ 字符在命名空间中没有特殊含义。
  • 从文件系统加载时,完全限定的命名空间和类以 .php 为后缀。
  • 供应商名称、命名空间和类名称中的字母字符可以是小写和大写的任意组合。

例子:

\Doctrine\Common\IsolatedClassLoader =>
/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php

\Symfony\Core\Request =>
/path/to/project/lib/vendor/Symfony/Core/Request.php

PSR-4(自动加载标准)

PSR-4 概述:

  • 术语“类”指的是类、接口、特征和其他类似的结构。
  • 完全限定的类名具有以下形式:
    \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
  • 完全限定的类名必须具有顶级命名空间名称,也称为“供应商命名空间”。
  • 完全限定的类名可以有一个或多个子命名空间名称。
  • 完全限定的类名必须有一个终止类名。
  • 下划线在全限定类名的任何部分都没有特殊含义。
  • 完全限定类名中的字母字符可以是小写和大写的任意组合。
  • 所有类名都必须以区分大小写的方式引用。

使用 Composer 基于 PSR-4 的自动加载示例:

  • 考虑以下目录结构以使用 Composer 实现基于 PSR-4 的自动加载。
psr_image6
  • 使用 composer init 创建一个 composer.json 文件。 如果没有,您现在可以在项目的根目录中手动创建一个。
psr_image7
  • 通过编辑 composer.json 文件来设置 PSR4 自动加载,如下所示:
psr_image8
  • 在这里,CodeCourse 是应用程序的供应商名称,您可以在命名 src 目录中的文件时使用此名称,例如:
    psr_image9

    或者

psr_image10

等等,

  • src 是您要自动加载的应用程序目录。
  • 接下来,打开您的终端并输入以下命令以在您的项目中安装自动加载文件。这将在其中生成供应商目录和 autoload.php 文件。
psr_image11
  • 让我们首先在 CodeCourse 目录中创建几个类。

在 CodeCourse/Filters 中创建 AuthFilters.php

psr_image11

在 CodeCourse/Repositories 中创建 UserRepository.php

psr_image12
  • 最后,创建一个 index.php 文件来测试它,并且需要将 autoload.php 文件一次 require 一次到您的 index.php 文件中。
psr_image14

PSR-1 & PSR-2

PSR-1 和 PSR-2 对 PHP 编码标准很有用。 PSR-1 主要侧重于 PHP 的基本编码标准,而 PSR-2 更像是 PSR-1 的扩展版本。 PSR-1 列出了一组简单的命名约定规则,PSR-2 提供了更全面的编码风格指南。

PSR-1(基本编码标准)

PSR-1 概述:

  • PHP 标签只允许 <?php 或 <?= 。
  • 类名必须在大写字母中定义。
  • 类变量必须在camelCase 中定义。
  • 类常量必须在 UPPER_SNAKE_CASE 中定义。
  • 方法名称必须以驼峰命名。
  • 文件应该声明符号(类、函数、常量等)或引起副作用(例如生成输出、更改 .ini 设置等),但不应该两者都做。 IE,
psr_image15

上面的例子会导致一个副作用,即加载一个名为“file.php”的文件。

  • 文件必须是没有 BOM(字节顺序标记)的 UTF-8。
  • 命名空间和类名必须遵循 PSR-0 和 PSR-4 中的标准。

下面是一个示例,说明了属性、类和方法的基本命名约定。

psr_image16

PSR-2(编码风格指南)

PSR-2 概述:

  • 您必须遵循 PSR-1 编码标准。
  • 4 个空格必须用于缩进。 不允许使用选项卡。
  • 行长没有限制,但应在 120 个字符以下,最好在 80 个字符以下。
  • 命名空间声明后必须有一个空行,使用声明块后必须有一个空行。
  • 类和方法的左花括号必须放在下一行,右花括号必须放在正文之后的一行。
  • 方法和属性必须先用abstract/final 定义,然后是public/protected,最后是static 关键字。
  • 您不得在条件语句中的花括号前放置换行符。
  • 您不得在条件语句中的 ( 和 ) 之前放置任何空格。
  • 定义类的示例:
  • 您必须在新行上打开花括号,并且必须在一行中使用 extends 和 implements 关键字。
psr_image17

如果有多个接口要实现,那么你可以在新行中写入接口名称,如下所示:

psr_image18

显示如何在 PHP 中定义方法的示例:
在定义方法时,参数应该写在同一行中。 此外,您不得在参数中的逗号之前放置任何空格,并且必须在它们之后放置一个空格。

psr_image19

如果有很多参数,那么它们可以一个接一个地写在换行符中:

psr_image20

定义方法时,您必须具有 public/protected/private 和 abstract/final 之一。 如果使用,可见性模式位于 abstract/final 关键字之后。 static 是最后一个修饰符。

psr_image21

条件语句

  • 您必须在 (
  • 您不得在 (
  • 您不得在 ) 之前放置任何空格
  • 你必须在 ) 后面放一个空格
  • 使用 elseif 而不是 else if。

显示 elseif 和 else if 之间区别的示例:
elseif的解释:

psr_image22

else if 的解释:

psr_image23

对于 switch 语句,

  • 花括号必须在编写 switch 语句的同一行中打开。
  • 外壳主体必须从外壳缩进一次,外壳必须从开关缩进一次。
  • 不需要休息时不要休息。
  • 您也可以使用 return 代替 break。

例子:

psr_image24