PHP 开发规范

1,153 阅读2分钟
  • 命名需要有意义,专有名词等特殊情况允许使用拼音 
  • 方法名采用首字母小写的驼峰方式,类名采用首字母大写的驼峰方式,方法名首词采用动词加驼峰 
  • 变量名都用首字母小写驼峰 
  • 常量定义大写,单词间以下划线分隔 

//变量
$userName = 'xia';
//常量
const  VERSION = '1.0';
const  SITE_URL = 'http://www.baidu.com';
  • PHP关键字都小写, 常量 true 、false 和 null 也都小写
  • 使用tab键来缩进,每个tab键长度必须设置4个空格
  • 每行最多120个字符;非空行不能有多余的空格;每行不能有多条语句
  • 每个函数或方法不能多于60行
  • 当数组有两个以上键值对时,请换行
  • 数组的键必须为小写字母,多个单词间用下划线分隔

$where = [
    'id' => 100,
    'user_name' => 'php'
];
  • 类以及类的方法大括号必须自成一行如下

class ClassName
{
    public function fooBarBaz($storeName, $storeId, array $info = [])
    {
        // method body
    }
}
  • 类文件名 类文件名必须和对应的类名一致,也是大驼峰式写法
  • 普通函数使用小写字母+下划线命名,且函数名紧跟括号,中间不能有空格,参数之间要有空格,大括号换行

function curl_request($a, $b)
{
     // method body
}
  • 所有的类必须设定一个命令空间
  • 命名空间(namespace)的声明后面必须有一行空行
  • 所有的导入(use)声明必须放在命名空间(namespace)声明的下面
<?php
namespace core;

use common;
  • 在导入(use)声明代码块后面必须有一行空行
<?php
namespace core;

use common;
use library;

class Person 
{
    
}
  • if/for/foreach/while/switch/do 等关键字与括号之间都必须加空格
if ($expr1) {
    // if body
} elseif ($expr2) {
    // elseif body
} else {
    // else body;
}
  • 在一个 switch 块内,都必须包含一个 default 语句并且 放在最后,即使空代码
  • extends implements 和类声明在一行
  • 成员属性访问修饰符必须显示声明不能省略
<?php
namespace Lib\Databaes;
 
class Mysql
{
    public    $foo  = null;
    private   $name = 'sam';
    protected $age  = '17';
}
  • 成员方法访问修饰符必须显示声明不能省略
<?php
namespace Lib\Databases;

class MySQL
{
    public function fetchOne()
    {
        // ......
    }
}
  • 方法参数在定义和传入时,多个参数逗号后边必须加空格, 函数参数默认值放最后, 方法参数给能够强制指定类型的指定类型
function fooBarBaz($arg1, &$arg2, $arg3 = [])
{
    // method body
}
function fooBarBaz(int $arg1)
{
    // method body
}
  • abstract, final 放在类的可见性描述符前面,static放在描述符后面
abstract class ClassName
{
    protected static $foo;
 
    abstract protected function zim();
 
    final public static function bar()
    {
        // method body
    }
} 
  • 建议函数参数尽量不要超过4个, return 返回数据类型一致
  • 类、方法、行数,要以/* */格式注释,第二行开始写注释内容,表明作者、时间、参数格式、返回格式等,常用标签有:@autor、@since、@param 、@return等,如:

/**
 * 我是类描述信息哦!
 * 
 * @author  Author
 * @since   2020.01.02
 * @version 1.0
 */
class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = []) 
    {
        // method body
    }
}

/**
 * 我是方法描述信息
 *
 * @author Author
 * @since  2020.01.02
 * @param ClassName $arg1 参数1描述 我是具体的对象类型哦
 * @param array $arg2 参数2描述 我是数据类型哦
 * @param int $arg3 参数3描述  我是基本数据类型哦
 * @return boolean
 
 */
 public function methodName(ClassName $arg1, array $arg2, $arg3) 
 {
    // method body
    return true; 
 }
  • 注释的双斜线与注释内容之间有且仅有一个空格

// 这是注释
  • 直接在方法中写数组参数时格式如下
$object->callFunc([
    'userId'   => 1,
    'username' => 'sam',
    'age'      => 20,
    'sex'      => 'male'
]);
  • 类中最后的花括号要换行
namespace Lib\Databaes;
 
class Mysql
{
    public getInfo ($name, $age, $gender = 1)
    {
    }
}

  • 未使用的局部变量或use的类没有使用到,必须删除
  • ifelse, foreach语句禁止嵌套超过3层,代码中应该减少直接的ifelse嵌套结构
  • 所有要使用的变量必须先声明,禁止直接使用未声明的变量
  • 单个文件禁止超过1500行,单个方法禁止超过80行,单个类禁止超过800行
  • 第三方服务的接入代码和系统自身的业务代码必须切割开,不得混合在一起
  • 所有的类必须通过composer实现自动加载,不得在代码中直接引入或使用其它方式引入
  • MVC要明确各自的作用,业务逻辑最好加个service层,控制器只负责传数据