关于PSR(Proposing a Standards Recommendation)

关于PSR(Proposing a Standards Recommendation)

PSR是由PHP-FIG(PHP Framework Interoperability Group)小组发起的非官方标准,详细的看这里PHP-FIG FAQ

PSR-0: 自动加载标准(Autoloader Standard)

要求

  • 一个完整的命名空间必须是以下结构 \<Vendor Name>\(<Namespace>\)*<Class Name>
  • 每个命名空间都必须拥有顶级域(Vendor Name)
  • 命名空间分隔符在加载对应文件时必须转换为DIRECTORY_SEPARATOR
  • 类名中的_转换成DIRECTORY_SEPARATOR,命名空间中的下划线无特殊含义
  • 命名空间对应的文件必须以.php来加载
  • 使用命名空间时按照字母排序

演示

\Symfony\Core\Request => /path/Symfony/Core/Request.php
\Zend\Acl => /path/Zend/Acl.php
\Zend\Mail\Message => /path/Zend/Mail/Message.php
\Doctrine\Common\IsolatedClassLoader => /path/Doctrine/Common/IsolatedClassLoader.php

\Foo\Bar\Baz_Qux => /path/Foo/Bar/Baz/Qux.php
\Foo\Bar_Baz\Qux_Sample => /path/Foo/Bar_Baz/Qux/Sample.php

PSR-0实现

<?php
function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName = $namespace = '';

    if($lastNsPos = strripos($className, '\\'))
    {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

    require $fileName;
}

PSR-1: 基本编码标准 (Basic Coding Standard)

要求

  • PHP文件中只能使用<?php<?标签
  • 文件必须使用无BOM UTF-8编码
  • 一个文件要么定义符号表(类, 方法, 常量等),要么做一些引起副作用的事情(产生输出, 改变.ini文件设置等), 但是不应该两样都做 (感谢@windk)
  • 命名空间以及类必须遵守PSR-0
  • 类名必须以大写开头的驼峰式规则命名 StudlyCaps
  • 类中的常量必须以大写字母命名,以下划线分割
  • 方法必须以小写开头的驼峰式规则命名 camelCase

类名命名的规则适用于 interface, trait

演示

  // 类名
    class Foo
    
    // 类常量
    const VERSION = '1.0';
    
    // 方法
    public function actionBar()

PSR-2: 编码规范(Coding Style Guide)

主要有以下几点要求

  • 必须遵守PSR-1标准
  • 必须使用4个空格缩进,而非tab
  • namespace和use关键字下必须空一行
  • 方法声明必须拥有可见性描述符,abstract和final在可见性描述符之前,static在可见性描述符之后
  • 控制结构中花括号
  • 所有PHP文件必须使用 Unix LF 作为结束
  • 不能用?>结束标签
  • 非空白行末端不能有空白符
  • PHP关键字必须小写

原文很长我就没有全部列出来,想要了解的可查看原文

PSR-2演示

<?php
namespace Vendor\Package;

use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class Foo extends Bar implements FooInterface
{
    public $foo = null; // 声明时赋初值

    private $bar = null;

    // 参数后有空格
    final public static function sampleFunction($a, $b = null)
    { // 花括号单独一行
        if ($a === $b) { // 括号两边有空格
            return 0;
        } elseif ($a > $b) { // 花括号与if一行
            return $a - $b;
        } else {
            return BazClass::bar($a, $b);
        }
    }

    // 控制结构
    abstract protected function sampleControl()
    {
        switch ($expr) {
            case 0:
                echo '.....';
                break;
            default:
                echo 'Default';
                break;
        }

        while ($expr) {
        
        }

        do {
        
        } while($expr);

        for ($i = 0, $i < 10; $i++) {

        }

        foreach($iterable as $key => $value) {
        
        }

        try {
        
        } catch(Exception $e) {

        } finally {
        
        }
    }

    // 闭包
    public function sampleClosure()
    {
        // 括号两边有空格
        $foo = function ($arg1, $arg2) {

        };

        $foo = function ($arg1, $arg2) use ($a, $b) {

        };
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值