首页 PHP小记正文

在团队开发中PHP代码风格规范设计与示例

刘伟 PHP小记 2018-06-22 340 0

代码风格规范设计与示例

PHP的PSR推荐规范,PSR-1,PSR-2,PSR-3,PSR-4详解 PHP的PSR推荐规范,PSR-1,PSR-2,PSR-3,PSR-4详解 PSR是php standards recommendation(php推荐标准)的简称。PHP-FIG制定了每个推荐的规范用于解决大多数php框架经常会遇到的某个具体 题。
php框架无需频繁解决相同的问题,他们可以遵守PHP-FIG制定的推荐规范,使用共用的方案来解决。 目前位置,PHP-FIG共发布了5个推荐标准。 PSR-1:基本的代码风格
PSR-2:严格的代码风格
PSR-3:日志记录器接口
PSR-4:自动加载 注意:
在这里你可能发现只有四个推荐标准,可是前面你说是五个标准。PHP-FIG废弃了第一份推荐规范PSR-0。第一份推荐标准被新发布的PSR-4替代了。 ##PSR-1:基本的代码风格 PHP标签
必须把php代码放在标签中。不得使用其他的PHP标签语法。
编码
所有PHP文件都必须使用UTF-8字符集编码。
目的
一个PHP文件可以定义符号(类、性状、函数和常量等),或者执行有副作用的操作(例如:生成结果或者处理数据),但不能呢个同时做这两件事。这是一个简单的要求,我们只需要深谋远虑一点。
自动加载
PHP命名空间和类必须遵守PSR-4自动加载器标准。
类的名称
PHP类的名称使用驼峰式。
常量的名称
PHP常量的名称必须全部使用大写。
方法的名称: PHP方法的名称必须一直使用驼峰式。 ##PSR-2:严格的代码风格 在使用PSR-2推荐规范的前提是,必须遵守PSR-1推荐规范。
缩进
PSR-2推荐规范要求PHP代码使用4个空格缩进。 因为,在不同的编辑器中,空格的渲染效果基本一致的,但是制表符却不一致。
文件和代码行
PHP文件必须使用UNIX风格的换行符,最后要有一个空行,而且不能使用PHP关闭标签?>。每行代码不能超过80个字符,至少不能超过120字符。每行的末尾不能有空格。
为什么PHP文件不使用?>关闭标签?
因为我们不写关闭标签,这样能避免意外的输出错误。如果加上关闭标签?>,而且在关闭标签的后面出现空行,那么这个空行会被当成输出,导致出错。
关键字
PSR-2推荐规范要求,PHP关键字都应该使用小写字母。
命名空间
每个命名空间声明语句后必须跟着一个空行。

类定义的结束括号必须在定义体之后新起一行写。如果扩展其他类或实现接口,extends和implements关键字必须和类名写在同一行。
<?php
    namespace my\app

    class Admin extends User
    {
        // 类的定义体
    }
方法
方法定义体的括号位置和类定义体的括号位置一样:方法定义体的起始括号要在方法名之后新起一行写;方法定义体的结束括号要在定义体之后新起一行写。要特别注意方法的参数;起始圆括号之后没有空格,结束括号之前也没有空格。方法的每个参数(除了最后一个)后面有一个逗号和空格。
<?php
    namespace my\app

    class Admin extends User
    {
         public function AdminLogin($num=1, $name='abc')
         {
           // 方法的定义体   
         }
    }
可见性
类中的每个属性和方法都要声明可见性。可见性由public,protected或private指定,其作用是决定在类的内部和外部访问属性和方法。如果把类属性和方法声明为abstract和final,这两个限定符必须放在可见性关键字之前。如果把属性或方法声明为static,这个限定符必须放在可见性关键字之后。
<?php
    namespace my\app

    class Admin
    {
        public static $name =1;
        public function __construct()
        {
            static::$name++;
        }
    }
拓展
abstract是什么,怎么使用?
abstract是抽象的意思。
1、没有抽象方法的抽象类是没有意义的。
2、抽象方法在子类中必须重写。
3、抽象方法在类中,此类必须声明为抽象类。
4、抽象类中,不能重写父类的抽象方法。
final是什么,怎么使用?
final是最终的意思。
1、final类不可被继承。
2、final方法不可重写。
static是什么,怎么使用?
static是静态的意思。
1、类中:
    self::属性 self::方法。
2、子类:
    parent::属性 parent::方法。
3、外部:
    类名/子类名::属性 类名/子类名::方法
控制结构
所有的控制结构关键字的后面都要有一个空格。控制结构关键字包括:if、elseif、else、switch、case、while、do while、for、foreach、try和catch。如果控制结构关键字后面有一对圆括号,起始圆括号后面不能有空格,结束圆括号之前不能有空格。与类和方法的定义体不同,控制结构关键字后面的起始括号应该和控制结构关键字写在同一行。控制结构关键字后面的结束括号必须单独的写一行。
<?php
    if ($a>10) {
     echo "小于10";
    }
PSR-3:日志记录器接口
PHP-FIG规定的日志记录器其实就是一个接口。PSR-3说接口复用了RFC 5424系统日志协议。
如果你正在准备自己开发日志记录器的话,可以你就别在浪费时间了。因为有个成熟的Monklog组件完全可以实现PSR-3接口,而且便于使用自定义的消息格式化程序和处理程序扩展功能。
Monolog的消息处理程序可以把日志消息写入文本文件,系统日志和数据库,能通过电子邮件发送,还能传给HipChat、Slack、网络中的服务器和远程API。只要你能想到的日志处理方式Monolog几乎提供了。如果Monolog没有你需要的处理程序,你也可以自己编写程序,并将其集成到Monolog中。
示例:将日志消息写入文本文件中。
<?php use Monolog\Logger; use Monolog\Handler\StreamHandler; // 准备日志记录器 $log = new Logger('name'); $log->pushHandler(new StreamHandler('path/warning.log', Logger::WARNING)); $log->pushHandler(new StreamHandler('path/debug.log', Logger::DEBUG)); // 使用日志记录器 $log->debug('yes'); $log->warning('yes'); 如果想更深的了解那么就可以看看,博客中《PHP日志记录器Monolog日志记录工具》这篇文章。 ##PSR-4:自动加载器 PHP-FIG发布的第四个推荐规范就是描述一个标准的自动加载器。自动加载器的策略就是依赖PHP命名空间和文件系统目录结构查找并加载PHP类、接口和性状。 那么,如何去编写PSR-4规范的自动加载器呢。 <?php
sql_auto_register(function ($class)) {
// 命名空间的前缀 $prefix = 'mysqlapp'; // 这个命名空间对应的基目录 $base_dir = DIR.'/src/'; // 获取传入的类名,是否使用的是这个命名空间前缀 $len = strlen($prefix); // 不使用,交给注册的下一个自动加载器处理 if (strncmp($class,$prefix,$len) !== 0) {
return; } // 获取去掉前缀后的类名 $relative_class = substr($class,$len); // 把命名空间前缀换成基目录,将命名空间的分隔符替换成目录分隔符,然后加上.php文件的后缀。 $file = $base_dir . str_replace('\','/',$relative_class).'.php'; // 如果文件存在,将其导入。 if (file_exitst($file)) { require $file; }
} 这段代码就是可用的PSR-4自动加载器了。如果你想自己编写自动加载器,那么请你停下来,因为,我们可以使用依赖管理器composer自动生成PSR-4自动加载器。

#开发注意事项

###变量
* 变量名称必须以字母或下划线开头

函数和类、属性命名

  • 类的命名采用驼峰法,并且首字母大写,例如 UserUserType,默认不需要添加后缀,例如UserController应该直接命名为User
  • 函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip
  • 方法的命名使用驼峰法,并且首字母小写,例如 getUserName
  • 属性的命名使用驼峰法,并且首字母小写,例如 tableNameinstance
  • 以双下划线“__”打头的函数或方法作为魔法方法,例如 __call__autoload
  • ***

目录和文件

  • 目录不强制规范,驼峰和小写+下划线模式均支持;
  • 类库、函数文件统一以.php为后缀;
  • 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;
  • 类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);

数据表和字段

  • 数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表字段命名。

常量和配置

  • 常量以大写字母和下划线命名,例如 APP_PATHTHINK_PATH
  • 配置参数以小写字母和下划线命名,例如 url_route_onurl_convert

缩进

  • 缩进使用Tab键来缩进,每个Tab键长度设置为4个空格;

##模块注意事项
  • 控制器层不能出现SQL操作语句,如 ThinkPHP框架的 where()、order() 等模型方法, 即,控制器中,不要出现类似这样的SQL语句:D('XXX')->where()->order()->limit()->find(); where()、order()、limit() 等SQL方法只能出现在 Model层、业务层! ​

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论