Skip to content
Menu
小小述博客
  • 首页
  • Nginx
  • Php
  • Laravel
  • Git
  • 在线工具
  • 资源下载
  • Magento2
小小述博客
2013年12月22日2019年12月22日

PHP 代码规范

Post Views: 640

FIG 制定的 PHP 规范,简称 PSR,是 PHP 开发的事实标准。FIG 是 Framework Interoperability Group (框架可互用小组) 的缩写,由几位开源框架的开发者成立于 2009 年。该组织的目的在于:以最低程度的限制,来统一各个项目的编码规范,避免各家自行发展的风格阻碍了程序设计师开发的困扰。PSR 是 Proposing a Standards Recommendation (提出标准建议) 的缩写。

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 了。

今天我们的代码规范是基于以上规范进行了整理。

1、PHP 源文件只能使用 <?php 和 <?= 这两种标签

<?php 标签通常用于纯 PHP 的脚本当中,而 <?= 通常用于模板当中。

2、PHP 源文件必须是不带 BOM 的 UTF-8 编码的文件

BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode 编码标准中用于标识文件是采用哪种格式的编码。

3、PHP 源文件缩进采用 4 个空格

很多编辑器使用 Tab 作为缩进。会造成空格性问题。

4、纯 PHP 代码的源文件关闭标签 ?> 必须省略

PHP 解析器在对文件进行解释的时候,会有性能提升。并且,这能一定程序避免在 ?> 之后有多余的空格导致程序报错。

5、请严格控制每行 120 个字符

过长的代码会导致多种分辨率的显示器造成兼容问题。并且,过长的代码也会造成难以阅读理解。如果实在太长,请把代码换行。

6、所有的类必须设定一个命令空间

命令空间给代码结构有较强的说明性,以及杜绝同名类的冲突问题。同时,也能用到 Composer 的自动加载优势特性。

<?php
namespace core;

​

7、命名空间(namespace)的声明后面必须有一行空行

空行会让代码看起来更加清晰容易阅读。

<?php
namespace core;

use common;

8、所有的导入(use)声明必须放在命名空间(namespace)声明的下面

这样会让代码结构变得清晰容易阅读。

<?php
namespace core;

use common;

9、一句声明中,必须只有一个导入(use)关键字

虽然 PHP 允许一行代码当中允许使用多个 use 关键字导入一个类。但是,这会使代码阅读造成障碍。

错误:

<?php
namespace core;

use common, library;

正确:

<?php
namespace core;

use common;
use library;

10、在导入(use)声明代码块后面必须有一行空行

空行让代码结构变得容易理解。

<?php
namespace core;

use common;
use library;

class Person {
    
}

11、PHP 关键字必须小写

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'

12、继承(extends) 和实现(implement) 必须和 class name 写在一行,切花括号要换行写。

<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{ // 换行写{
     
}

13、成员属性访问修饰符必须显示声明不能省略

成员属性有三种访问修饰符:public、protected、private。不能使用老式的 var 来声音成员属性。

<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
    public    $foo  = null;
    private   $name = 'sam';
    protected $age  = '17';
}

14、成员方法访问修饰符必须显示声明不能省略

成员方法有三种访问修饰符:public、protected、private。

错误:

<?php
namespace Lib\Databases;

class MySQL
{
    function fetchOne()
    {
        // ......
    }
}

正确:

<?php
namespace Lib\Databases;

class MySQL
{
    public function fetchOne()
    {
        // ......
    }
}

15、方法的参数有多个的时候,每个参数的逗号后面必须加个空格

namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
    public getInfo ($name, $age, $gender = 1)
    {
    }
}

16、当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明(public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。

<?php
namespace Vendor\Package;
 
abstract class ClassName
{
    protected static $foo; // static 放后面
 
    abstract protected function zim(); // abstract 放前面
 
    final public static function bar() // final 放前面,static 放最后。
    {
        // 方法主体部分
    }
}

17、控制结构花括号、换行、空格等规范

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
}

18、类名必须与文件名一样

这个很容易理解,没啥好补充说明的。除非框架有特殊的加载规则。

19、类的命名必须遵循 StudlyCaps 大写开头的驼峰命名规范

StudlyCaps 即单词首字母大写风格。有些人也称它为大驼峰。

20、方法名称必须符合 camelCase 式的小写开头驼峰命名规范

camelCase 即第一个单词首字母小写后面的单词首字母大写的风格。

21、类中的常量所有字母都必须大写,单词间用下划线分隔

CONST ORDER_STATUS = 1;

22、变量必须使用小驼峰命名风格

$cardNo   = ''; // 卡号。 
$idCardNo = ''; // 身份证号。

23、参数必须使用驼峰命名风格

参数也是变量的一种。故与变量的命名风格一致。

24、所有方法的起始花括号必须另起一行。

虽然以下两种在实际开发中都是允许的。但是,为了保持代码一致。所以,必须强制使用。

错误:

<?php

class MySQL
{
    public function fetchOne() {
        
    }
}

正确:

<?php

class MySQL
{
    public function fetchOne() 
    {
        
    }
}

25、直接在方法中写数组参数时格式如下

$object->callFunc([
    'userId'   => 1,
    'username' => 'sam',
    'age'      => 20,
    'sex'      => 'male'
]);

26、方法参数注释

/**
 * 管理后台获取优惠券发送记录。
 *
 * @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)返回值。需要给出返回的类型。

27、方法的代码行数不能超过一屏

每个人的显示器分辨率不一样。既然不超过一屏也会出现别的同事一屏会超出的情况。所以,即使未超过一屏,也尽量保证代码行在 40 行以内。如果发现自己的代码超过了 40 行,那么就需要考虑自己的代码是不是有拆分不合理的地方。特殊情况允许超过 40 行。但是,整个方法里面的代码必须是简单的判断逻辑。不包含复杂的业务判断逻辑。因为,不同的业务判断最佳实践是单独封装一个方法。

发表回复

要发表评论,您必须先登录。

504 API Bootstrap基础 Composer 基础 Docker elasticsearch facebook Git 基础 Google Go 入门 IntegerNet_Solr jdk Jquery Laravel Laravel-admin Laravel 入门到精通教程 Laravel 基础 Linux Cron Linux sudo linux命令 Linux权限 Linux 用户和组 Linux 解压 Lnmp Magento2 主题 Magento2 事件 Magento2 功能 Magento2 命令 Magento2 安装 Magento2 数据库 Magento2 模块 Mamp Paypal php Phpstorm PHP优化 PHP函数 Php面试题 Robots solr Sourcetree SSH SSL Wordpress 阿里云服务器

  • linux 系统查看所有用户的crontab定时任务2023年1月5日
  • Mgento 2 缓存文件用户组权限不对2023年1月5日
  • Magento 2 中怎么禁用事件观察器2022年12月30日
  • Elasticsearch 安装与卸载2022年12月2日
  • Magento 2.4 Content security policies 内容安全策略2022年11月2日
  • Magento 2.4 Disable Page Builder2022年11月1日
  • phpMyAdmin无法缓存模板文件,所以会运行缓慢2022年10月29日
  • PhpMyAdmin配置文件现在需要一个短语密码2022年10月29日
  • Mamp xxx column name table_namePlease run mysql_upgrade2022年10月29日
  • 如何在 PHPMYADMIN 中将表数据显示设置为最大5002022年10月26日
  • 开源工厂
  • 码农网
  • 前端学习
  • Get社区学习
  • Guru99 学习
  • tecadmin.net
  • 深入理解PHP内核
  • 国际IT专场
  • 51CTO
  • https://bbs.mallol.cn
  • http://techjeffyu.com/
  • https://webkul.com/
  • qastack
  • Innfoq
  • 刘祥博客
  • 阿里云
  • DigitalOcean
  • 华为云服务器
  • 华为云开发者中心
  • 华为云服务器文档
  • 阿里云服务器文档
  • Linux命令大全(手册)
  • WEB技术分享
  • 博学无忧博客
  • Ostechnix
  • Linux公社
  • LinuxHomene
  • Linux 服务器操作
  • Linux 就该这么学
  • Linux 从入门到精通
  • Linux 中国开源社区
  • Linux命令大全(手册)
  • Ubuntu Apache 命令学习
  • CSDN
  • 菜鸟学习教程
  • 鸟哥的Linux 私房菜
  • w3school教程
  • Bootstrap 中文网
  • Yii 中文网
  • Yii中文框架
  • 程序员的在线工具
  • 运维教程
  • 梦康的博客
  • 考评师
  • 社交分享教程
  • GitHub
  • 后端进阶
  • 端隐SDP 零信任安全
  • 示说网
  • 脚本之家
  • 开源资源
  • 蓝文资源库
  • Ubuntu 官网
  • linuxize.com
  • Linux Help
  • tecmint
  • 脚本之家在线工具
  • php1中文社区
  • 云知梦
  • IT之家
  • https://www.geeksforgeeks.org/
  • https://laravel-school.com/
  • https://laravelacademy.org/
  • https://zditect.com/guide/
  • https://www.studytonight.com/
  • https://dev.to/
  • https://dev.to/listings
  • https://dev.to/saifullah/8-free-websites-to-learn-coding-3c5
  • https://www.rakeshjesadiya.com/
  • magento-2-video-tutorials

©2023 小小述博客 | Powered by WordPress and Superb Themes!