php中PSR-[0-4]代码规范学习记录
1. PSR是什么?
PSR是一套代码编写规范,用于约束代码风格。以前没有规范的时候大家都是按照自己的习惯来书写代码,但每个人风格不一样,你的代码在别人看来就是很不爽。而且会导致许多问题:
function 函数名是否驼峰命名,
花括号{}是否换行写,
是该写注释呢还是不写
变量名是大写还是小写,
一个php文件中是一个类好还是允许有多个
所以PSR-[0-4]规范就应运而生,大家都共同遵守,就没有风格差异了。
PSR是由PHP-FIG这个组织发明的,FIG 是 Framework Interoperability Group(框架可互用性小组)的缩写。PSR是Proposing a Standards Recommendation(提出标准建议)的缩写。截止到目前为止,总共有5套PSR规范,分别是:
PSR-0 (Autoloading Standard) 自动加载标准
PSR-1 (Basic Coding Standard) 基础编码标准
PSR-2 (Coding Style Guide) 编码风格向导
PSR-3 (Logger Interface) 日志接口
PSR-4 (Improved Autoloading) 自动加载的增强版,可以替换掉PSR-0了。
2. 规范的使用和定义
1. PSR-0规范
PSR-0是第一套规范,主要用于规范自动加载,不过现在已经过时了,被PSR-4规范替代了。
PSR-0强制性要求几点:
1. 一个完全合格的namespace和class必须符合这样的结构:“\< Vendor Name>(< Namespace>)*< Class Name>”
2. 每个namespace必须有一个顶层的namespace("Vendor Name"提供者名字)
3. 每个namespace可以有多个子namespace
4. 当从文件系统中加载时,每个namespace的分隔符(\)要转换成 DIRECTORY_SEPARATOR(操作系统路径分隔符)
5. 在类名中,每个下划线(_)符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线(_)符号是没有(特殊)意义的。
6. 当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的
7. verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)
第一条: 一个完全合格的namespace和class必须符合这样的结构:“< Vendor Name>(< Namespace>)*< Class Name>”
假如我的文件路径为Lib/Driver/Config.php
,那么我的namespace的申明和使用为:
申明:namespace \Lib\Driver;
使用:use \Lib\Driver\Config;
第二三条:每个namespace必须有一个顶层的namespace("Vendor Name"提供者名字),每个namespace可以有多个子namespace
namespace \Lib\Driver\Config->/path/to/vender/Lib/Driver/Config.php
Lib就是顶层namespace,Driver就是子namespace/
第四条:当从文件系统中加载时,每个namespace的分隔符()要转换成 DIRECTORY_SEPARATOR(操作系统路径分隔符)
new \Lib\Driver\Config->转换的目录为/Lib/Driver/Config.php,替换反斜杠为目录分隔符
第五条:在类名中,每个下划线(_
)符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线(_
)符号是没有(特殊)意义的
\Lib\Driver\Class_Name->转换为目录为/Lib/Driver/Class/Name.php
\Lib\Package_Name\Class_Name->转换为目录为/Lib/Package_Name/Class/Name.php
目录中的_
就是下划线,classname中的下划线实际上会转为成路径分隔符。
但这个规定在PSR-4中已经取消了,不再需要转换了。
第六条:当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的
加载的文件必须是.php结尾,既然使用php当然是.php结尾了。不再像以前那样有什么php3,php5
第七条:verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)
由于Liunx是区分大小写的,而windows是不区分大小写的,所以如果不注意大小写在win下正常开发,但是到了服务器上可能就无法正常执行了。
2. PSR-1规范
要求:
1. PHP源文件必须只使用 <?php 和 <?= 这两种标签。
2. 源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8。
3. 一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
4. 命名空间(namespace)和类(class) 必须遵守PSR-0标准。
5. 类名(class name) 必须使用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
6. 类(class)中的常量必须只由大写字母和下划线(_)组成。
7. 方法名(method name) 必须使用驼峰式(cameCase)写法。
第一条: PHP源文件必须只使用 <?php 和 <?= 这两种标签
因为php有4种标签形式,所以这里规定了使用哪一种,统一规范。
第二条:源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8
windows笔记本默认是会在文件头部加入BOM头的,会导致在服务器上输出的很奇怪。
国内的中文编码是GBK,UTF-8是国际通用编码,不统一的话也会导致乱码。
第三条:一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
不要在一个文件中又是定义函数又是修改系统配置的,一个文件只做一件事。
// 副作用:修改了ini配置
ini_set('error_reporting', E_ALL);
// 副作用:载入了文件
include "file.php";
// 副作用:产生了输出
echo "<html>\n";
// 声明 function
function foo()
{
// 函数体
}
分开写
// 声明 function
function foo()
{
// 函数体
}
// 副作用:修改了ini配置
ini_set('error_reporting', E_ALL);
// 副作用:载入了文件
include "file.php";
这样就很整齐。
第四条:命名空间(namespace)和类(class) 必须遵守PSR-0标准
参见PSR-0标准
第五条:类名(class name) 必须使用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
类名必须使用驼峰命名,大驼峰小驼峰都可以。
<?php
class BigHouse{
}
第六条:类(class)中的常量必须只由大写字母和下划线(_)组成。
<?php
class Test{
const USER_INFO = 'xx';
const NAME = 'xx';
}
第七条:方法名(method name) 必须使用驼峰式(cameCase)写法。
<?php
class Test{<