PHP中对PSR-1、PSR-2规范理解

PHP中对PSR-1、PSR-2规范理解

PHP-FIG

在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG。就是这个联盟组织发明和创造了PSR-[0-4]规范

FIG 是 Framework Interoperability Group(框架可互用性小组)的缩写,由几位开源框架的开发者成立于

2009 年,从那开始也选取了很多其他成员进来,虽然不是 “官方” 组织,但也代表了社区中不小的一块。

项目的目的在于:通过框架作者或者框架的代表之间讨论,以最低程度的限制,制定一个协作标准,各个框架遵循统一的编码规范,避免各家自行发展的风格阻碍了

PHP 的发展,解决这个程序设计师由来已久的困扰。

目前已表决通过了 6 套标准,已经得到大部分 PHP 框架的支持和认可。

1 基础编码规范 PSR-1
2 编码风格规范 PSR-2
3 日志接口规范 PSR-3
4 自动加载规范 PSR-4
6 缓存接口规范 PSR-6
7 HTTP 消息接口规范


基础编码规范

  1. PHP代码文件 必须<?php<?= 标签开始;
  2. PHP代码文件 必须 以 不带 BOM 的 UTF-8 编码;
  3. PHP代码中 应该 只定义类、函数、常量等声明,或其他会产生 副作用 的操作(如:生成文件输出以及修改 .ini配置文件等),二者只能选其一;

    「副作用」(side effects) 一词的意思是,仅仅通过包含文件,不直接声明类、函数和常量等,而执行的逻辑操作。
    「副作用」包含却不仅限于:

    • 生成输出
    • 直接的 require 或 include
    • 连接外部服务
    • 修改 ini 配置
    • 抛出错误或异常
    • 修改全局或静态变量
    • 读或写文件等

    以下是一个 反例,一份包含「函数声明」以及产生「副作用」的代码:

    <?php
    // 「副作用」:修改 ini 配置
    ini_set('error_reporting', E_ALL);
    
    // 「副作用」:引入文件
    include "file.php";
    
    // 「副作用」:生成输出
    echo "<html>\n";
    
    // 声明函数
    function foo()
    {
        // 函数主体部分
    }

    下面是一个仅包含声明的示例文件;即应提倡的例子:

    <?php
    // 声明
    function foo()
    {
        // 函数体
    }
    
    // 条件式声明不算做是副作用
    if (! function_exists('bar')) {
        function bar()
        {
            // 函数体
        }
    }
  4. 命名空间以及类 必须 符合 PSR 的自动加载规范:[PSR-4]() 中的一个;
  5. 类的命名必须 遵循 StudlyCaps 大写开头的驼峰命名规范;

    类的属性命名 可以 遵循:

    • 大写开头的驼峰式 ($StudlyCaps)
    • 小写开头的驼峰式 ($camelCase)
    • 下划线分隔式 ($under_score)

    本规范不做强制要求,但无论遵循哪种命名方式,都 应该 在一定的范围内保持一致。这个范围可以是整个团队、整个包、整个类或整个方法。

  6. 类中的常量所有字母都 必须 大写,单词间用下划线分隔;

    <?php
    namespace Vendor\Model;
    
    class Foo
    {
        const VERSION = '1.0';
        const DATE_APPROVED = '2012-06-01';
    }
  7. 方法名称 必须 符合 camelCase 式的小写开头驼峰命名规范。

编码风格规范

  1. 代码必须遵守 PSR-1。
  2. 代码必须使用4个空格来进行缩进,而不是用制表符。
  3. 一行代码的长度不建议有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少。
  4. 在命名空间(namespace)的声明下面必须有一行空行,并且在导入(use)的声明下面也必须有一行空行。
  5. 类(class)的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行。
  6. 方法(method)的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行。

    <?php
    namespace Vendor\Package;
    
    use FooInterface;
    use BarClass as Bar;
    use OtherVendor\OtherPackage\BazClass;
    
    class Foo extends Bar implements FooInterface
    {
        public function sampleFunction($a, $b = null)
        {
            if ($a === $b) {
                bar();
            } elseif ($a > $b) {
                $foo->bar($arg1);
            } else {
                BazClass::bar($arg2, $arg3);
            }
        }
    
        final public static function bar()
        {
            // 方法主体
        }
    }
  7. 所有的属性(property)和方法(method)必须有可见性声明;抽象(abstract)和终结(final)声明必须在可见性声明之前;而静态(static)声明必须在可见性声明之后。

    <?php
    namespace Vendor\Package;
    
    abstract class ClassName
    {
        protected static $foo;
    
        abstract protected function zim();
    
        final public static function bar()
        {
            // 方法主体部分
        }
    }
  8. 在控制结构关键字的后面必须有一个空格;而方法(method)和函数(function)的关键字的后面不可有空格。
  9. 控制结构的左花括号必须跟其放在同一行,右花括号必须放在该控制结构代码主体的下一行。
  10. 控制结构的左括号之后不可有空格,右括号之前也不可有空格。

    <?php
    if ($expr1) {
        // if body
    } elseif ($expr2) {
        // elseif body
    } else {
        // else body;
    }

日志接口规范

详见


自动加载规范

详见


缓存接口规范

详见


HTTP 消息接口规范

详见,暂无中文翻译

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101731.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • nginx和apache的区别,选择哪个好?

    nginx和apache的区别,选择哪个好?Apache和Nginx最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;而nginx是异步的,多个连接(万级别)可以对应一个进程。下面本篇文章就来给大家介绍一下Apache和Nginx的区别有那些,选择哪个好?希望对你们有所帮助。一、Nginx特点  1、轻量级,采用C进行编写,同样的web服务,会占用更少的内存及资源。  2、抗并发,nginx以epollandkqueue作为开发模型,处理请求是异步非阻塞的,负载能力比apache高很多,而apache则.

  • 几个常用算法的适应场景及其优缺点!

    几个常用算法的适应场景及其优缺点!

    2021年11月22日
  • docker 修改容器时间_jenkins docker持续集成

    docker 修改容器时间_jenkins docker持续集成前言用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间查看时间查看系统时间date-R进入docker容器内部,查看容器时间dockere

  • er图的表示方法_立体图形简笔画

    er图的表示方法_立体图形简笔画本文章和大家分享如何画ER图,因为在计算机毕业设计、课程设计、文档报告中经常用到,所以还是有必要和大家共同来学习一下。一、先看图熟悉E-R图中图形及代表的意思在我们毕业论文、课题报告等文档中,涉及到画E-R图(实体-联系图)是非常常见的。如上图所示,我将详细为大家介绍E-R图中每个图形的含义及用法,在我们针对自己的系统如何画E-R图,这才是至关重要的!长方形:表示实体。什么是实体?实体是客观存在的事物。例如用户、商品、订单、供应商等。说直白点!!!你数据库的表名就可以做一个实体对象。一个系统.

  • 进程池及回掉函数[通俗易懂]

    进程池在说进程池之前先来说一个概念:数据共享数据共享1.进程间的通信应该尽量避免共享数据的方式2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的。虽然进程间数据独立

  • axios 跨域问题_为什么会出现跨域问题

    axios 跨域问题_为什么会出现跨域问题什么是跨域首先需要了解到浏览器的同源策略,同源策略是最核心也是最基本的安全功能,缺少同源策略浏览器的正常功能可能会受到影响。同源策略会阻止一个域的javascript脚本和另外一个域的能容进行交互。同源(即指在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。当一个请求url的协议、域名、端口三个之间任意一个与当前页面url不同即为跨域。Vue中用Axios解决跨域问题配置代理可解决使用Axios不能直接进行跨域…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号