【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/

 

------------------------------------------------------------------------------

欢迎关注我的公众号【phper的进阶之路】,将不断更新各种技术心得,免费提供各种学习资源!!!

【PHP开发规范】老生常谈的编码开发规范你懂多少?的更多相关文章

  1. 「PSR 规范」PSR-2 编码风格规范

    所有 PSR 规范请见:https://learnku.com/docs/psr  https://learnku.com/laravel/t/2079/psr-specification-psr-2 ...

  2. 【安全开发】IOS安全编码规范

    申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...

  3. 【安全开发】Android安全编码规范

    申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...

  4. 【PHP开发规范】继承与扩展:PSR-2 编码风格规范

    之前的一篇文章是对PSR-1的基本介绍 接下来是PSR-2 编码风格规范,它是 PSR-1 基本代码规范的继承与扩展. PSR-1 和PSR-2是PHP开发中基本的编码规范,大家其实都可以参考学习下, ...

  5. 【python】-- 内置函数、软件目录开发规范(代码编码风格)

    内置函数 一.内置函数表格 二.内置函数演示 1.abs(x) 功能:取数的绝对值 >>> abs(-1) #取-1的绝对值 1 ########################## ...

  6. Web前端开发规范文档(google规范)

    (Xee:其实没什么规范约束,但是养成一种好习惯,何乐而不为?) 区分大小写 xhtml  区分大小写,xhtml要求 标签名 属性名 值都要小写,并且要有双引号和 标签闭合. css 元素名称以及i ...

  7. 构建你的长寿命的API第1部分:规范驱动的API开发

    构建你的长寿命的API第1部分:规范驱动的API开发 这篇文章是由MuleSoft的Mike Stowe在nginx.conf 2016公布的演示文稿改编的.第一部分重点是规范驱动的API开发. 第二 ...

  8. Windows Phone开发(13):如何规范用户的输入行为

    原文:Windows Phone开发(13):如何规范用户的输入行为 很多时候,我们对用户的操作或输入做一定程度的限制,以避免发生不必要的异常或错误,因此,对一些特殊的类型,进行输入限制是很有必要的. ...

  9. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

随机推荐

  1. CVE-2018-10945 mongoose越界访问

    Hello , I found a vulneratility in mg_handle_cgi function The function is in mongoose.c , line 8925  ...

  2. maven 远程仓库、私服及镜像配置

    maven仓库分类 本地仓库.远程仓库.远程仓库又有私服.中央仓库.其它公共库.中央仓库是maven自带的核心仓库. 仓库配置远程仓库可以配置多个,超级pom中定义的中央仓库 <reposito ...

  3. mybatis resultMap 映射配置

    现有数据库表: CREATE TABLE `dept_p` ( `DEPT_ID` ) NOT NULL, `DEPT_NAME` ) DEFAULT NULL, `PARENT_ID` ) DEFA ...

  4. 类和类的关系——java

    类(对象)之间的关系   1.继承关系(子类自动拥有了父类所有的成员变量和普通方法,如果父类的成员变量和普通方法是private 的,那么子类只有拥有权,没有使用权.父类的构造方法在子类的构造方法执行 ...

  5. vue.js高仿饿了么(前期整理)

    1.熟悉项目开发流程 需求分析——>脚手架工具——>数据mock——>架构设计——>代码编写——>自测——>编译打包. 2.熟悉代码规范 从架构设计.组件抽象.模块 ...

  6. React +Redux+ Ant Design + echarts 项目实践

    项目框架 采用React.js作为项目的框架 采用redux作为数据管理的框架 采用antd作为项目的UI组件 采用echarts完成项目中折线图的绘制 个人项目工作流程总结 拿到UI高保真图片之后先 ...

  7. leetCode Detect Capital

    1.问题描述 Given a word, you need to judge whether the usage of capitals in it is right or not. We defin ...

  8. Selenium clear()方法无法清掉数据

    问题描述 clear()方法执行过后, 数据还是在. 根本原因 存在镜像节点. 操作clear()清掉数据后, 镜像节点的数据还在, 就会再补充回去. 解决办法 添加下面代码就可以连同镜像的数据一起去 ...

  9. Apache服务器如何通过.htaccess文件设置防盗链?

    Apache服务器通过.htaccess文件设置防盗链 用户经常面对的一个问题就是服务器的流量问题,而站点文件被盗链是其中最为主要的部分.所谓盗链,是指其他网站直接链接我们网站上的文件,一般来说,盗链 ...

  10. Oracle EBS 清理归档

    oraprod 登陆数据库服务器 执行 rman target / 如图: 执行: delete noprompt force archivelog all completed before ‘sys ...