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 语句,即,在使用它之前,如下所示。

上面的方法提出了一些问题,就好像我们有数十个外部类要在一个文件中使用一样,我们就在源文件的开头开始编写 require/include 语句行。
为了解决这个问题,PHP 5 引入了魔术函数 __autoload(),当您的代码引用尚未加载的类或接口时,它会自动调用。

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

__autoload() 函数的主要缺点是您只能提供一个自动加载器。 PHP 5.1.2 引入了另一个自动加载函数 (spl_autoload_register) 来应对 __autoload 的限制。
spl_autoload_register() 的引入使程序员能够创建自动加载链,这是一系列可以调用以尝试加载类或接口的函数。
例如:


自动加载是一个很棒的想法,以至于每个项目都开始使用它。 由于缺乏统一的标准,每个人都不可避免地创建了自己的自动装载机版本。 显然,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 的自动加载。

- 使用 composer init 创建一个 composer.json 文件。 如果没有,您现在可以在项目的根目录中手动创建一个。

- 通过编辑 composer.json 文件来设置 PSR4 自动加载,如下所示:

- 在这里,CodeCourse 是应用程序的供应商名称,您可以在命名 src 目录中的文件时使用此名称,例如:

或者

等等,
- src 是您要自动加载的应用程序目录。
- 接下来,打开您的终端并输入以下命令以在您的项目中安装自动加载文件。这将在其中生成供应商目录和 autoload.php 文件。

- 让我们首先在 CodeCourse 目录中创建几个类。
在 CodeCourse/Filters 中创建 AuthFilters.php


在 CodeCourse/Repositories 中创建 UserRepository.php

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

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,

上面的例子会导致一个副作用,即加载一个名为“file.php”的文件。
- 文件必须是没有 BOM(字节顺序标记)的 UTF-8。
- 命名空间和类名必须遵循 PSR-0 和 PSR-4 中的标准。
下面是一个示例,说明了属性、类和方法的基本命名约定。

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

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

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

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

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

条件语句
- 您必须在 (
- 您不得在 (
- 您不得在 ) 之前放置任何空格
- 你必须在 ) 后面放一个空格
- 使用 elseif 而不是 else if。
显示 elseif 和 else if 之间区别的示例:
elseif的解释:

else if 的解释:

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