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 消息接口规范

详见,暂无中文翻译

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MMC卡SPI模式「建议收藏」

    MMC卡SPI模式「建议收藏」MMC/SD卡简单SPI模式驱动1. SPI模式下CRC检验无效的。 2. 命令格式是6个字节,采用大端法进行数据传输。3. 第一个是(命令号|0x40)。4. 第2-5个是有些命令需要地址,用来设置地址的,而其他的可以任意填充。5. 最后一个字节是CRC校验位,除了CMD0为95H外,其他可以任意填充。6.命令发送函数。1).片选拉低

    2022年6月2日
    31
  • GStreamer播放RTSP视频流[通俗易懂]

    GStreamer播放RTSP视频流[通俗易懂]本代码是使用GStreamer播放RTSP视频流,没有使用playbin,而是自己构建pipeline,经测试可以正常播放视频。代码如下:#include<gst/gst.h>/*Structuretocontainallourinformation,sowecanpassittocallbacks*/typedefstruct_CustomData{GstElement*pipeline;…

    2022年10月17日
    0
  • littlevgl移植_嵌入式ubuntu系统

    littlevgl移植_嵌入式ubuntu系统总述Littlevgl相比较于安卓、QT,占用资源少、使用简单,所以在linux系统下使用Littlevgl优势也比较明显。移植准备工作源码:lvgl:https://github.com/littlevgl/lvgl驱动:lv_drivers:https://github.com/littlevgl/lv_drivers例子:lv_examples:https://github.com/littlevgl/lv_examples下载慢可以将上面链接先导入到码云上再下载。配置工作源码

    2022年9月2日
    2
  • 实验室 系统_实验室设备管理系统流程图

    实验室 系统_实验室设备管理系统流程图【简介】今天分享一个简单的实验室设备管理系统SSM项目,作者分享在了开源网站上,版权归原作者,这里记录一下测试的过程和体验,对课程设计和毕业设计帮助很多,欢迎大家多批评和交流。作者的开发环境是Java1.8+Tomcat8.5+eclipse-Photon+Maven+Mysql;前端采用了layui布局,使用angularjs与后台json交互,后端由Maven构建,采用spring、springMVC、mabatis框架,数据……

    2022年10月13日
    0
  • 记录一次成功的EC、BIOS降级操作[通俗易懂]

    记录一次成功的EC、BIOS降级操作[通俗易懂]记录一次成功的EC、BIOS降级操作(N1.0.16降至N1.0.7)笔记本型号:​ 机械革命X8ti操作环境:​ windows必备工具:DiskGeniusBIOS文件EFI启动文件(来源:机械革命)操作流程:打开DiskGenius,选中需要格式化的U盘,格式化FAT32(其他格式无效),分区表类型可以根据自身情况选择MBR还是GUID。…

    2022年7月20日
    33
  • python自行实现支付宝证书签名&验签全流程[通俗易懂]

    python自行实现支付宝证书签名&验签全流程[通俗易懂]支付宝Pythonsdk只有密钥签名,没有证书签名,下面是本人自行实现签名全流程证书签名需要新加alipay_root_cert_sn和app_cert_sn两个参数,这两个参数需要解析支付宝根证书(alipay_root_cert_sn)和应用公钥证书(appCerPublicKey_”app_id”.crt)得到:defsn_string():root_file_li=open(alipayRootCert.crt’,’r’).read().split(‘\n\n’)

    2022年5月11日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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