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 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

重学javascript 红皮高程

最近的先行者计划的学习内容是JS高级程序设计,正好我也跟着再重过一遍JS基础的内容。 这行做到现在,我用JQ,写一般的应用,业务逻辑,插件、组件,只要逻辑清晰写...

1838
来自专栏c#开发者

如何给DataGrid添加自动增长列

如何给DataGrid添加自动增长列 我想我们都知道在数据库中如何添加自增长列,我们可以将这个自增长列绑定到DataGrid上使得用户方便的知道现在是第几行,今...

41210
来自专栏walterlv - 吕毅的博客

深入了解 WPF Dispatcher 的工作原理(PushFrame 部分)

发布于 2017-09-25 19:49 更新于 2017-09...

452
来自专栏向治洪

React Native在Android平台运行gif的解决方法

概述 目前RN在Android平台上不支持gif格式的图片,而在ios平台是支持的,期待以后的版本中系统也是可以默认支持Android的。首先说下在ios平台怎...

1816
来自专栏Crossin的编程教室

【Python 第36课】 异常处理

在程序运行时,如果我们的代码引发了错误,python就会中断程序,并且输出错误提示。 比如我们写了一句: print int('0.5') 运行后程序得到错误...

2657
来自专栏24K纯开源

Android Studio快捷键每日一练(6)

51、重构代码 苹果:Ctrl+T    Windows:Ctrl+Alt+Shift+T 该快捷键会根据当前上下文环境,针对所选择的代码给出重构选项列表。这个...

20510
来自专栏肖力涛的专栏

Spark踩坑记:共享变量

如果我们想在节点之间共享一份变量,比如一份公共的配置项,该怎么办呢?Spark为我们提供了两种特定的共享变量,来完成节点间变量的共享。 本文首先简单的介绍spa...

8341
来自专栏happyJared

IDEA快捷键拆解系列(四):View篇

  以下是关于View导航项及其每一子项的拆解介绍,其中,加粗部分的选项是博主认为比较重要的。

551
来自专栏分布式系统和大数据处理

.Net 项目代码风格参考

代码风格没有正确与否,重要的是整齐划一,这是我拟的一份《.Net 项目代码风格参考》,供大家参考。

1182
来自专栏我杨某人的青春满是悔恨

Kingfisher源码阅读(一)

Kingfisher是喵神写的一个异步下载和缓存图片的Swift库,github上将近3k的Star,相信不需要我再安利了。它的中文简介在这里,github地址...

1132

扫码关注云+社区