ModernPHP读书笔记(二) ——PHP开发标准

ModernPHP读书笔记(二)

——PHP开发标准

(原创内容,转载请注明来源,谢谢)

本文主要讲述PHP-FIG(PHP FrameworkInteroperability Group(PHP框架可互用性小组))发布的四套开发标准,该标准主要目的是为了让各类PHP框架相互兼容,降低PHP开发人员的学习难度,让致力于框架研发改造的开发者可以集中精力于开发,而不在于学习新的框架。我个人也曾忙于学习各框架的实现过程,而仿佛落入大海中,忽略了框架的内核与中心。如果该标准推广,所有框架的基本形式均相同,会非常易于快速上手,并致力于研究框架本身,而不是各类语法。因此,我很喜欢该标准。

一、目的

制定标准的主要目的在于:

1、通过让各框架实现接口,实现面向接口编程;

2、各框架采用相同的自动加载机制;

3、框架间通过标准的代码风格合作。

二、规范

PHP-FIG共制定五套规范,编号PSR-0~PSR-4,但是PSR-0已经被PSR-4取代,因此已经废弃,故讨论的规范通常只讨论四套规范。

四套规范分别是:

1、PSR-1 (BasicCoding Standard) 基础编码标准

2、PSR-2(Coding Style Guide) 编码风格向导

3、PSR-3(Logger Interface) 日志记录器接口

4、PSR-4(Autoloading Standard) 自动加载标准

三、PSR-1

PSR-1主要定义一些最基础的编码规范,如下。

1、PHP代码应放置于<?php?>或<?= ?>之中。

2、所有PHP文件采用UTF-8编码,不采用字节顺序标记编码(BOM)。

3、一个PHP文件仅实现一个功能,可以是类、性状(trait)、常量等。

4、命名空间遵循PSR-4。

5、类名采用首字母大写的驼峰式(CamelCase),方法名采用首字母小写的驼峰式(camelCase),常量全部大写并可用下划线分割(例如CONST_TRUE)。

四、PSR-2

PSR-2较PSR-1有更严格的规定。

1、要求完全贯彻PSR-1。

2、缩进采用四个空格,而不是tab制表符,防止各文本编辑器的解码不同导致错位。

3、换行采用UNIX风格换行符,每行不超过80个字符,行尾不留空格,不采用?>标签作为文件的结尾。(不采用?>标签,是为了防止如果在标签后不慎输入空格或者回车等字符,会发生异常情况。)

4、方法的大括号另起一行,圆括号内的参数每个逗号后面都有一个空格,但开始和结尾无空格。例如:

         functiontestFunction($val1, $val2, $val3)//圆括号内第一个$前面和数字3后面没有空格
         {
                   //….
         }

5、类名、性状大括号另起一行(同方法),extends、implements同一行。例如:

         classTestClass extends Test
         {
                   //…
         }

6、命名空间定义或导入的语句后面空一行。例如:

namespacetest

…….

7、属性或者方法都要加上可见性定义(public、private、protected),abstract、final放在可见性之前,static放置于可见性之后。

8、控制语句(如if、while)的大括号与命令同一行,中间有一个空格。例如:

         if($x==1) {
                  //….
         }

五、PSR-3

PSR-3定义了一组对象,称之为日志记录器。符合此标准的框架,对于日志的记录给出一个接口,但不实现,允许开发者找自己喜欢的第三方日志记录组件使用。推荐使用第三方组件monolog。

1、实现符合PSR-3标准的日志

首先,不推荐自己去实现,除非是专门开发日志的开发组。

要实现日志,需要实现Psr\Log路径下的LoggerInterface接口,该接口定义了9个方法,分别用来记录RFC5424中定义的9个等级的日志:debug、info、notice、warning、error、critical、alert、emergency、log。

每个方法允许输入两个参数,第一个参数是必须的参数,是一个字符串或者一个__toString()方法的对象,要求输入日志信息;第二个参数是可选参数,是一个数组,可以让第一个参数输入的内容进行占位符替换功能。

占位符举例:

$message = “uid{uid}-name{name}modified”;
$context =array(‘uid’=>1, ‘name’=>’test’);

2、monolog使用方法

Monolog简单易用,需要自定义功能也很好往里加。使用方式如下:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
//定义Logger实例
$log = new Logger('dbLoger');//定义名称
$log->pushHandler(new StreamHandler('path/logname.log',Logger::WARNING));
// 记录信息
$log->addWarning('Duplicated id');
$log->addError('Connection failed');

六、PSR-4

PSR-4为自动加载器,是指PHP运行时根据实际需要动态查找PHP的类、接口或者性状,并进行加载。通俗来说即动态调用include、require。

PSR-4自动加载的策略,是依赖命名空间的前缀和相对应的文件系统的路径,这两部分内容都可以自定义。

另外,可以采用Composer组件引入加载器,后续文章中会进行描写。

PHP实现自动加载器的示例:

         <?php
         spl_autoload_register(function($class){
                   $pre= 'Linhxx\\Test\\';
                   $base= __DIR__.'/src/';
                   $len= strlen($pre);
                   if(strncmp($pre,$base, $len) != 0){
                            return;
                   }
                   $autoloadClass= substr($class, $len);
                   $file= $base.str_replace('\\', '/', $autoloadClass).'php';
                   if($file_exists($file)){
                            require$file;
                   }else{
                            echo'无'.$base.str_replace('\\', '/', $autoloadClass).'php文件,请检查是否路径有误';
                            returnfalse;
                   }
         });

——written by linhxx 2017.06.30

相关阅读:

PHP实用功能——modern PHP读书笔记(一)

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-06-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏施炯的IoT开发专栏

《101 Windows Phone 7 Apps》读书笔记-PASSWORDS & SECRETS

课程内容 Ø 加密和解密 Ø 密码输入框 Ø 值转换 Ø DataTimeOffset Ø 可观察集合 Ø INotifyProperty...

1849
来自专栏向治洪

蘑菇街Android组件与插件化

插件化的基石 -- apk动态加载 随着我街业务的蓬勃发展,产品和运营随时上新功能新活动的需求越来越强烈,经常可以听到“有个功能我想周x上,行不行”。行么?...

19010
来自专栏博客园

深入浅出话命令

WPF为我们准备了完善的命令系统,你可能会问:“有了路由事件为什么还需要命令系统呢?”。事件的作用是发布、传播一些消息,消息传达到了接收者,事件的指令也就算完成...

724
来自专栏娱乐心理测试

小程序的网络请求封装

2367
来自专栏GuZhenYin

使用localResizeIMG3+WebAPI实现手机端图片上传

前言 惯例~惯例~昨天发表的使用OWIN作为WebAPI的宿主..嗯..有很多人问..是不是缺少了什么 - - 好吧,如果你要把OWIN寄宿在其他的地方...代...

1868
来自专栏生信宝典

Bookdown文档生成教程

bookdown是一款及其方便的编写技术文档或教材的工具,语法简洁,数据处理灵活。支持Rmarkdown或普通markdown通过pandoc软件转换为HTML...

2125
来自专栏大前端开发

从编程小白到全栈开发:响应用户的操作

咳嗽连续咳了一个多月,蓝瘦,我都快要忘记更新文章了...还好一个读友提醒我怎么好久没更新了,我才提起一口气,嘎吱嘎吱的重新转起我这磨损严重的脑袋来。

674
来自专栏阮一峰的网络日志

Firebug控制台详解

Firebug是网页开发的利器,能够极大地提升工作效率。 但是,它不太容易上手。我曾经翻译过一篇《Firebug入门指南》,介绍了一些基本用法。今天,继续介绍它...

34012
来自专栏林德熙的博客

win10 uwp 如何创建修改保存位图 创建保存图片在 Image 控件使用WriteableBitmap 转换通过读写像素转换 CanvasBitmap

在 UWP 使用底层的图像渲染就是使用 Softwarebitmap ,这个类提供直接数据修改,可以使用这个类进行软渲染。实际上 Softwarebitmap ...

401
来自专栏IT技术精选文摘

Java Instrument 功能使用及原理

1163

扫描关注云+社区