PSR规范

1 篇文章 0 订阅
PSR是PHP社区的一系列编程规范,包括PSR-1基础代码规范、PSR-2编码风格、PSR-3日志接口和PSR-4自动加载等。这些规范旨在提高代码的互通性和一致性,例如,PSR-2要求使用4个空格缩进,方法名采用camelCase,文件以UTF-8无BOM编码。PSR-4规范了类名与文件路径的映射,促进自动加载。
摘要由CSDN通过智能技术生成

PSR规范

PSR 不是PHP官方标准,而是从如Zend、Symfony2等知名PHP项目中提炼出来的一系列标准,目前有越来越多的社区项目加入并遵循该标准。
PSR-0 自动加载 X已废弃 PSR-1 基本代码规范 PSR-2 代码样式 PSR-3 日志接口 PSR-4 如何指定文件路径从而自动加载类定义

PSR-1基本代码规范

本篇规范制定了代码基本元素的相关标准,以确保共享的PHP代码间具有较高程度的技术互通性。

文件

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

命名空间与类

类命名 必须 遵循 StudlyCaps 大写开头的驼峰命名规范;
每个类都独立为一个文件,且命名空间至少有一个层次:顶级的组织名称(vendorname)

<?php
namespace core;

类属性:小写开头驼峰 $studlyCaps
类方法:小写开头驼峰

常量

类中的常量所有字母都 必须 大写,单词间用下划线分隔;
方法名称 必须 符合 camelCase 式的小写开头驼峰命名规范。

PSR-2编码风格规范

缩进
代码 必须 使用4个空格符而不是「Tab 键」进行缩进。

每行的字符数 应该 软性保持在 80 个之内,一定不可 多于 120 个,但 一定不可 有硬性限制。

所有PHP文件必须以一个空白行作为结束。

每行 一定不可存在多于一条语句 每个 namespace 命名空间声明语句和 use 声明语句块后面,必须 插入一个空白行。

<?php
namespace core;

use common;

在导入(use)声明代码块后面必须有一行空行

<?php
namespace core;

use common;
use library;

class Person {
    
}

类的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须写在函数主体后自成一行。

方法的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须 写在函数主体后自成一行。

控制结构的开始花括号({) 必须 写在声明的同一行,而结束花括号(}) 必须 写在主体后自成一行。

修饰符

类的属性和方法 必须 添加访问修饰符(private、protected 以及 public),abstract 以及final 必须 声明在访问修饰符之前,而 static 必须 声明在访问修饰符之后。

<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
    public    $foo  = null;
    private   $name = 'sam';
    protected $age  = '17';
}
<?php
namespace Vendor\Package;
 
abstract class ClassName
{
    protected static $foo; // static 放后面
 
    abstract protected function zim(); // abstract 放前面
 
    final public static function bar() // final 放前面,static 放最后。
    {
        // 方法主体部分
    }
}

空格

类方法参数每个逗号后面必须要有一个空格,而逗号前面 一定不可 有空格

控制结构的开始左括号后和结束右括号前,都 一定不可 有空格符。

关键字

控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不可有。
PHP所有 关键字 必须 全部小写,常量 true 、false 和 null 也 必须 全部小写。

'__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor'

PSR-3日志接口规范

LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency 。

第九个方法 —— log,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须 与直接调用以上八个方法具有相同的效果。

如果传入的等级常量参数没有预先定义,则 必须 抛出PsrLogInvalidArgumentException 类型的异常。在不确定的情况下,使用者 不该 使用未支持的等级常量来调用此方法。

/**
 * 日志等级常量定义
 */class LogLevel{
    const EMERGENCY='emergency';
    const ALERT     ='alert';
    const CRITICAL  ='critical';
    const ERROR     ='error';
    const WARNING   ='warning';
    const NOTICE    ='notice';
    const INFO      ='info';
    const DEBUG     ='debug';
}

PSR-4自动加载规范

类似如下范例:<NamespaceName>(<SubNamespaceNames>)*<ClassName>
完全合规类名必须有一个顶级命名空间(Vendor Name)
完全合规类名可以有多个子命名空间
完全合规类名应该有一个终止类名

下划线在完全合规类名中是没有特殊含义的

字母在完全合规类名中可以是任何大小写的组合
所有类名必须以大小写敏感的方式引用

终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配

一些实际商用项目中使用的规范

控制层

不出现sql语句(sql封装到模型层然后作为方法调用)
sql语句、3行以上逻辑代码空行
上下文关系函数或方法间不空行
bool使用if(true === $name)的形式
使用双引号链接变量
注意隐式转换
使用全局变量需要注释其含义,取值范围:

/**
* Global STATUS_CODE
* 0 - sucess
* 2 - ERROR
*/
STATUS_CODE

函数头部如下注释:
1)方法说明。
2)创建方法的同事编号以及时间。
3)修改方法的同事编号以及时间与修改的内容。
4)参数注释:类型、名称、参数说明。参数与其他注释之间要有空行。
5)参数示例:如果参数当中有复杂的参数。可以在参数下方给出示例以增强说明。
6)返回值。需要给出返回的类型。

/**
 * 管理后台获取优惠券发送记录。
 *
 * @author 7031 2018-02-23
 * @modify 7031 2019-02-25 修复了 SQL 性能问题。
 *
 * @param int    $couponId      优惠券ID。
 * @param string $username      用户名。
 * @param string $mobilephone   用户手机号。
 * @param int    $page          当前分页页码。
 * @param int    $count         每页显示条数。
 * @param array  $data          请求参数。
 *
 * ------------------- eg:start ---------------------
 * $data = [
 *     'username' => '用户账号,没有时传空字符串',
 *     'age'      => '用户年龄,没有时传0',
 * ];
 * ------------------- eg:end -----------------------
 *
 * @return array
 */
public static function getBackendSendHistory($couponId = -1, $username, $mobilephone, $page, $count, $data) {

}

switch语句的case跳转需要注释

if ($expr1) { // 左右空格
    // if body
} elseif ($expr2) { // elesif 连着写
    // elseif body
} else {
    // else body;
}

switch ($expr) { // 左右空格
    case 0:
        echo 'First case, with a break'; // 对齐
        break; // 换行写break,也对齐。
    case 1:
        echo 'Second case, which falls through';
        // no break
    case 2:
    case 3:
    case 4:
        echo 'Third case, return instead of break';
        return;
    default:
        echo 'Default case';
        break;
}

while ($expr) { // 左右空格
    // structure body
}
 
do {
    // structure body; // 左右空格
} while ($expr);

for ($i = 0; $i < 10; $i++) { // 注意几个参数之间的空格
    // for body
}

foreach ($iterable as $key => $value) { // 还是空格问题
    // foreach body
}

try {
    // try body
} catch (FirstExceptionType $e) { // 同样也是注意空格。
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇亲

你的鼓励将我创作最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值