FIG 制定的
PHP
规范,简称PSR
,是PHP
开发的事实标准。FIG
是Framework Interoperability Group
(框架可互用小组) 的缩写,由几位开源框架的开发者成立于 2009 年。该组织的目的在于:以最低程度的限制,来统一各个项目的编码规范,避免各家自行发展的风格阻碍了程序设计师开发的困扰。PSR
是Proposing a Standards Recommendation
(提出标准建议) 的缩写。php
PSR 原来有五个规范,分别是:html
PSR-0 (Autoloading Standard)
自动加载标准。PSR-1 (Basic Coding Standard)
基础编码标准。PSR-2 (Coding Style Guide)
编码风格向导。PSR-3 (Logger Interface)
日志接口。PSR-4 (Improved Autoloading)
自动加载的加强版,能够替换掉 PSR-0
了。今天咱们的代码规范是基于以上规范进行了整理。sql
PHP
源文件只能使用 <?php
和 <?=
这两种标签
<?php
标签一般用于纯PHP
的脚本当中,而<?=
一般用于模板当中。数组
PHP
源文件必须是不带 BOM
的 UTF-8
编码的文件
BOM(Byte Order Mark)
,字节顺序标记,出如今文本文件头部,Unicode
编码标准中用于标识文件是采用哪一种格式的编码。框架
PHP
源文件缩进采用 4 个空格不少编辑器使用
Tab
做为缩进。会形成空格性问题。编辑器
PHP
代码的源文件关闭标签 ?>
必须省略
PHP
解析器在对文件进行解释的时候,会有性能提高。而且,这能必定程序避免在?>
以后有多余的空格致使程序报错。ide
过长的代码会致使多种分辨率的显示器形成兼容问题。而且,过长的代码也会形成难以阅读理解。若是实在太长,请把代码换行。性能
命令空间给代码结构有较强的说明性,以及杜绝同名类的冲突问题。同时,也能用到 Composer 的自动加载优点特性。fetch
<?php namespace core;
namespace
)的声明后面必须有一行空行空行会让代码看起来更加清晰容易阅读。ui
<?php namespace core; use common;
这样会让代码结构变得清晰容易阅读。
<?php namespace core; use common;
虽然 PHP 容许一行代码当中容许使用多个 use 关键字导入一个类。可是,这会使代码阅读形成障碍。
错误:
<?php namespace core; use common, library;
正确:
<?php namespace core; use common; use library;
空行让代码结构变得容易理解。
<?php namespace core; use common; use library; class Person { }
PHP 的关键字,必须小写,boolean 值: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'
<?php namespace Lib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 写一行 { // 换行写{ }
成员属性有三种访问修饰符:
public
、protected
、private
。不能使用老式的var
来声音成员属性。
<?php namespace Lib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 写一行 { public $foo = null; private $name = 'sam'; protected $age = '17'; }
成员方法有三种访问修饰符:
public
、protected
、private
。
错误:
<?php namespace Lib\Databases; class MySQL { function fetchOne() { // ...... } }
正确:
<?php namespace Lib\Databases; class MySQL { public function fetchOne() { // ...... } }
namespace Lib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 写一行 { public getInfo ($name, $age, $gender = 1) { } }
<?php namespace Vendor\Package; abstract class ClassName { protected static $foo; // static 放后面 abstract protected function zim(); // abstract 放前面 final public static function bar() // final 放前面,static 放最后。 { // 方法主体部分 } }
if、else、elseif、switch、for、foreach、case、while、go、try、catch 等关键词后面必须加空格。能够说,没有特殊说明的状况下,基本上全部的 PHP 关键词后面都必须加空格。
流程控制语句起始的花括号是不须要另起一行。
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 }
这个很容易理解,没啥好补充说明的。除非框架有特殊的加载规则。
StudlyCaps
大写开头的驼峰命名规范StudlyCaps 即单词首字母大写风格。有些人也称它为大驼峰。
camelCase
式的小写开头驼峰命名规范camelCase 即第一个单词首字母小写后面的单词首字母大写的风格。
CONST ORDER_STATUS = 1;
$cardNo = ''; // 卡号。 $idCardNo = ''; // 身份证号。
参数也是变量的一种。故与变量的命名风格一致。
虽然如下两种在实际开发中都是容许的。可是,为了保持代码一致。因此,必须强制使用。
错误:
<?php class MySQL { public function fetchOne() { } }
正确:
<?php class MySQL { public function fetchOne() { } }
$object->callFunc([
'userId' => 1, 'username' => 'sam', 'age' => 20, 'sex' => 'male' ]);
/** * 管理后台获取优惠券发送记录。 * * @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) { }
能够看出,有如下几个注释特色:
1)方法说明。
2)建立方法的同事编号以及时间。
3)修改方法的同事编号以及时间与修改的内容。
4)参数注释:类型、名称、参数说明。参数与其余注释之间要有空行。
5)参数示例:若是参数当中有复杂的参数。能够在参数下方给出示例以加强说明。
6)返回值。须要给出返回的类型。
每一个人的显示器分辨率不同。既然不超过一屏也会出现别的同事一屏会超出的状况。因此,即便未超过一屏,也尽可能保证代码行在 40 行之内。若是发现本身的代码超过了 40 行,那么就须要考虑本身的代码是否是有拆分不合理的地方。特殊状况容许超过 40 行。可是,整个方法里面的代码必须是简单的判断逻辑。不包含复杂的业务判断逻辑。由于,不一样的业务判断最佳实践是单独封装一个方法。