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自动加载器。

总结:

目前位置,PHP的PSR推荐规范以及对PSR-1,PSR-2,PSR-3,PSR-4的详解,就到此为止,希望对你有所帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容