【PHP开发规范】老生常谈的编码开发规范你懂多少?
【PHP开发规范】老生常谈的编码开发规范你懂多少?
这几天看了一下阿里技术发布的一套Java开发规范《阿里巴巴Java开发手册》,里面写了阿里内部的Java开发规范标准,写的很好。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本。
看完我去搜下了一些PHP的一些开发规范标准,其中了解到了PSR规范是PHP行业中常用的一套开发标准。感叹自己学得那么少,标准的规范这么晚才发现。
其实对于新手或者有几年经验的开发者来说,这些规范我们都要掌握的,很多时候我们做好这些规范,在协同开发中,能提高我们的开发质量和效率。
什么是PSR?
PSR 是 PHP Standard Recommendations 的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。

PHP FIG目前已表决通过了 6 套标准,已经得到大部分 PHP 框架的支持和认可。
其中已经通过的有:
- PSR-1 基础编码规范
- PSR-2 编码风格规范
- PSR-3 日志接口规范
- PSR-4 自动加载规范
- PSR-6 缓存接口规范
- PSR-7 HTTP 消息接口规范
*注:其中PSR-0已被弃用,PSR-5还在起草中,以后再补充
这里先介绍PSR-1 基础编码规范
1. 概览
- PHP代码文件 必须 以 <?php 或 <?= 标签开始;
- PHP代码文件 必须 以 不带 BOM 的 UTF-8 编码;
- PHP代码中 应该 只定义类、函数、常量等声明,或其他会产生 副作用 的操作(如:生成文件输出以及修改 .ini 配置文件等),二者只能选其一;
- 命名空间以及类 必须 符合 PSR 的自动加载规范:[PSR-4]() 中的一个;
- 类的命名 必须 遵循 StudlyCaps 大写开头的驼峰命名规范;
- 类中的常量所有字母都 必须 大写,单词间用下划线分隔;
- 方法名称 必须 符合 camelCase 式的小写开头驼峰命名规范。
2. 文件
2.1. PHP标签
PHP代码 必须 使用 <?php ?> 长标签 或 <?= ?> 短输出标签;
一定不可 使用其它自定义标签。
2.2. 字符编码
PHP代码 必须 且只可使用 不带BOM的UTF-8 编码。(这点很重要)
2.3. 副作用
一份 PHP 文件中 应该 要不就只定义新的声明,如类、函数或常量等不产生 副作用 的操作,要不就只书写会产生 副作用 的逻辑操作,但 不该 同时具有两者。
「副作用」(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()
{
// 函数主体部分
}
}
3. 命名空间和类
命名空间以及类的命名必须遵循 [PSR-4]()。
根据规范,每个类都独立为一个文件,且命名空间至少有一个层次:顶级的组织名称(vendor name)。
类的命名 必须 遵循 StudlyCaps 大写开头的驼峰命名规范。
PHP 5.3 及以后版本的代码 必须 使用正式的命名空间。
例如:
<?php
// PHP 5.3及以后版本的写法
namespace Vendor\Model;
class Foo
{
}
5.2.x 及之前的版本 应该 使用伪命名空间的写法,约定俗成使用顶级的组织名称(vendor name)如 Vendor_ 为类前缀。
<?php
// 5.2.x及之前版本的写法
class Vendor_Model_Foo
{
}
4. 类的常量、属性和方法
此处的「类」指代所有的类、接口以及可复用代码块(traits)。
4.1. 常量
类的常量中所有字母都 必须 大写,词间以下划线分隔。
参照以下代码:
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
}
4.2. 属性
类的属性命名 可以 遵循:
- 大写开头的驼峰式 ($StudlyCaps)
- 小写开头的驼峰式 ($camelCase)
- 下划线分隔式 ($under_score)
本规范不做强制要求,但无论遵循哪种命名方式,都 应该 在一定的范围内保持一致。这个范围可以是整个团队、整个包、整个类或整个方法。
4.3. 方法
方法名称 必须 符合 camelCase() 式的小写开头驼峰命名规范。
参考资料:
https://psr.phphub.org/
------------------------------------------------------------------------------

【PHP开发规范】老生常谈的编码开发规范你懂多少?的更多相关文章
- 「PSR 规范」PSR-2 编码风格规范
所有 PSR 规范请见:https://learnku.com/docs/psr https://learnku.com/laravel/t/2079/psr-specification-psr-2 ...
- 【安全开发】IOS安全编码规范
申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...
- 【安全开发】Android安全编码规范
申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...
- 【PHP开发规范】继承与扩展:PSR-2 编码风格规范
之前的一篇文章是对PSR-1的基本介绍 接下来是PSR-2 编码风格规范,它是 PSR-1 基本代码规范的继承与扩展. PSR-1 和PSR-2是PHP开发中基本的编码规范,大家其实都可以参考学习下, ...
- 【python】-- 内置函数、软件目录开发规范(代码编码风格)
内置函数 一.内置函数表格 二.内置函数演示 1.abs(x) 功能:取数的绝对值 >>> abs(-1) #取-1的绝对值 1 ########################## ...
- Web前端开发规范文档(google规范)
(Xee:其实没什么规范约束,但是养成一种好习惯,何乐而不为?) 区分大小写 xhtml 区分大小写,xhtml要求 标签名 属性名 值都要小写,并且要有双引号和 标签闭合. css 元素名称以及i ...
- 构建你的长寿命的API第1部分:规范驱动的API开发
构建你的长寿命的API第1部分:规范驱动的API开发 这篇文章是由MuleSoft的Mike Stowe在nginx.conf 2016公布的演示文稿改编的.第一部分重点是规范驱动的API开发. 第二 ...
- Windows Phone开发(13):如何规范用户的输入行为
原文:Windows Phone开发(13):如何规范用户的输入行为 很多时候,我们对用户的操作或输入做一定程度的限制,以避免发生不必要的异常或错误,因此,对一些特殊的类型,进行输入限制是很有必要的. ...
- amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules
amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...
随机推荐
- CVE-2018-10945 mongoose越界访问
Hello , I found a vulneratility in mg_handle_cgi function The function is in mongoose.c , line 8925 ...
- maven 远程仓库、私服及镜像配置
maven仓库分类 本地仓库.远程仓库.远程仓库又有私服.中央仓库.其它公共库.中央仓库是maven自带的核心仓库. 仓库配置远程仓库可以配置多个,超级pom中定义的中央仓库 <reposito ...
- mybatis resultMap 映射配置
现有数据库表: CREATE TABLE `dept_p` ( `DEPT_ID` ) NOT NULL, `DEPT_NAME` ) DEFAULT NULL, `PARENT_ID` ) DEFA ...
- 类和类的关系——java
类(对象)之间的关系 1.继承关系(子类自动拥有了父类所有的成员变量和普通方法,如果父类的成员变量和普通方法是private 的,那么子类只有拥有权,没有使用权.父类的构造方法在子类的构造方法执行 ...
- vue.js高仿饿了么(前期整理)
1.熟悉项目开发流程 需求分析——>脚手架工具——>数据mock——>架构设计——>代码编写——>自测——>编译打包. 2.熟悉代码规范 从架构设计.组件抽象.模块 ...
- React +Redux+ Ant Design + echarts 项目实践
项目框架 采用React.js作为项目的框架 采用redux作为数据管理的框架 采用antd作为项目的UI组件 采用echarts完成项目中折线图的绘制 个人项目工作流程总结 拿到UI高保真图片之后先 ...
- leetCode Detect Capital
1.问题描述 Given a word, you need to judge whether the usage of capitals in it is right or not. We defin ...
- Selenium clear()方法无法清掉数据
问题描述 clear()方法执行过后, 数据还是在. 根本原因 存在镜像节点. 操作clear()清掉数据后, 镜像节点的数据还在, 就会再补充回去. 解决办法 添加下面代码就可以连同镜像的数据一起去 ...
- Apache服务器如何通过.htaccess文件设置防盗链?
Apache服务器通过.htaccess文件设置防盗链 用户经常面对的一个问题就是服务器的流量问题,而站点文件被盗链是其中最为主要的部分.所谓盗链,是指其他网站直接链接我们网站上的文件,一般来说,盗链 ...
- Oracle EBS 清理归档
oraprod 登陆数据库服务器 执行 rman target / 如图: 执行: delete noprompt force archivelog all completed before ‘sys ...