最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP-PSR 现代PHPer的开发规范

    正文概述 转载于:掘金(PHP进阶架构师)   2020-12-16   319

    1 人赞同了该文章

    PSR是php Standards Recommendation的简称,意为PHP推荐标准。要想了解PSR,首先得知道制定这一标准的人/组织是谁————PHP-FIG。

    PHP-FIG

    PSR-1:基本的代码风格

    在文章的最开始,我们就已经简单介绍过什么是PSR,PSR是PHP标准,而PSR-1是PHP最基本也是最简单的标准。

    PHP标签

    这点相信很多PHPer都很容易遵守,而且在现实撸代码中一般都是采用正常的<?php ?>标签

    编码

    这个也很常见,就是无BOM和有BOM格式,记得刚开始敲PHP代码的时候,前辈总是很关照,一定要用IDE调成无BOM格式啊,当时表示懵懂,然后就跟着做了,现在看到这里,又重新查了资料,找到了为什么不能使用有BOM格式的原因,BOM会产生多余的输出,就像平白无故多了一个空行:

    目的

    这个规定的意思差不多就是一个变量、方法或者一个类,只能相应完成一个操作、做一件事情,这样保证了代码的清晰易懂,也保证了方法、变量的单一性,各司其职。其实也是为了方便,我们在以后项目/应用较大时,可以很好的解耦

    自动加载

    后续看PSR-4的具体解释

    类的名称

    驼峰式和分词式(每个单词用_隔开)这两种写法,记得以前存在很大的争议,有人支持驼峰(GirlFriend),有人支持分词式(girl_friend),现在好了,统一规定出来了,为了PHP更好的发展,那就委屈支持分词式的兄弟,统一驼峰了。记得公司的CI2项目,用的就是这种分词式,不过也是框架规定,后来在自己的项目中,自己有预感的使用了驼峰式,哈哈,为自己的眼光点赞~

    常量的名称

    这点应该是毋庸置疑的吧,最开始写PHP的时候,这个写法已经根深蒂固了。

    方法的名称

    方法的命名和类的命名方式有些相似,不过还是有些区别:类的命名规定首字母大写(BoyFriendMoney),而方法的命名规定首字母小写(boyFriendMoney)

    PSR-2:严格的代码风格

    PSR-2 相较于PSR-1是更为严格的代码规范。个人和官方都认为开发者应该遵循更为严格的代码标准,在现代的PHP生态系统中,风格统一,可以更好的让其他开发者理解PHP代码。

    贯彻PSR-1

    缩进

    关于缩进这个问题,相信有很多争议。我在真正正视这个问题之前,一直使用的都是IDE的tab键。然后当同事和自己在编写同一文件的时候,就会出先代码缩进不一的情况,导致代码结构非常乱。所以在出现这个问题之后,就统一了一下文件缩进的标准,以四个空格为缩进。这样的话,就算是用不一致的编辑器打开,效果也是一样的。
    很多IDE都可以设置tab键,百度一下就可以搜到。

    文件和代码行

    最开始我也不懂为什么在纯PHP页面中不使用关闭 ?> 标签,后来在书中找到了答案

    关键字

    之前不知道在哪儿看的PHP的教程,上面写的PHP代码像truefalse这样的关键字都使用的是大写TRUEFALSE,我也一直在这样使用,后来看到PSR-2的规范,才知道应该要使用小写,心累~

    命名空间

    类似于:

    <?php
    // 声明本文件的命名空间
    namespace My\Friend;
    
    // 导入命名空间
    use Other\Friend;
    
    class GirlFrined
    {
    
    }
    

    例:

    <?php
    
    class Frined
    {
        public function getSex()
        {
            // do something
        }
    }
    

    方法

    请参考上面类示例中方法的例子。

    可见性

    例子:

    // 1、2
    public $sex;
    private $_sex;
    protected $sex;
    
    // 3、
    abstract public $sex;
    final public $sex;
    
    // 4、
    public static $sex;
    public static $age;
    

    控制结构

    例:

    /** 
    * 错误的示例:
    * 这里有4个错误:
    * 1、if关键词后面和圆括号之前没有空格
    * 2、圆括号前后有空格
    * 3、后圆括号和起始括号之前没有空格
    * 4、else关键词前后没有空格
    **/
    if( 1 == true ){
        // do something
    }else{
        // do something
    }
    
    /** 
    * 正确的示例:
    **/
    if (1 == true) {
        // do something
    } else {
        // do something
    }
    

    PSR-3:日志记录器接口

    日志记录器

    PHP-FIG发布的第三个推荐规范和前两个不同,这个有点特殊,是一个接口。规定PHP日志记录器组件可以实现的方法。

    相信基本上所有的框架中都实现了日志功能,那么如果想要使用PSR-3规范的日志记录器,该怎么做呢?首先要满足两点:

    1. 日志功能委托给第三方库实现
    2. 最终用户能选择他们喜欢的日志记录器组件

    编写PSR-3日志记录器

    符合PSR-3推荐规范的PHP日志记录器组件,必须包含一个实现Psr\Log\LoggerInterface接口的PHP类。PSR-3接口复用了RFC 5424系统日志协议,规定要实现9个方法:

    下面的代码是我从PHP-FIG的官网上拿过来的,想了解详细信息的可以 点我

    <?php
    
    namespace Psr\Log;
    
    interface LoggerInterface
    {
    
        public function emergency($message, array $context = array());
        public function alert($message, array $context = array());    
        public function critical($message, array $context = array());
        public function error($message, array $context = array());
        public function warning($message, array $context = array());
        public function notice($message, array $context = array());
        public function info($message, array $context = array());
        public function debug($message, array $context = array());
        public function log($level, $message, array $context = array());
    }
    

    这个类中的每一个方法都对应RFC 5424协议的一个日志级别,而且都接受两个参数。第一个参数必须是一个字符串,或者有一个__toString()方法的对象。第二个参数为数组,可选参数;

    如果要编写符合PSR-3规范的日志记录器,那么就要创建一个实现Psr\Log\LoggerInterface接口的PHP类,而且要提供这个接口中每个方法的具体实现

    使用PSR-3日志记录器

    PSR-3规范出来之后,达到这种效果的组件太多了,这里就不介绍,如何实现这个接口的类了。现在有成熟的日志记录器组件,推荐monolog/monolog。这个组件完全上线了PSR-3的接口,而且可以使用自定义的消息格式化程序和处理程序扩展功能
    如果monolog满足不了日常的使用,我们可以在此基础上拓展自己的方法,也非常简单;

    使用monolog示例:

    <?php
    use Monolog\Logger;
    use Monolog\Handler\StreamHandler;
    
    // 准备日志记录器
    $logger = new Logger('my_logger');
    $logger->pushHandler(new StreamHandler('logs/development.log', Logger::DEBUG));
    $logger->pushHandler(new StreamHandler('logs/production.log', Logger::WARNING));
    // 使用日志记录器
    $logger->debug('This is debug message');
    $logger->debug('This is warning message');
    

    PSR-4:自动加载器

    PHP-FIG发布的第四个推荐规范描述了一个标准的自动加载器策略;自动加载器的意思就是指在程序运行时按需查找PHP类、接口(interface)或性状(trait)并将其载入加载器。

    自动加载器策略

    PSR-4推荐规范不要求改变代码的实现方式,只建议如何使用文件系统目录结构和PHP命名空间组织代码。PSR-4**依赖**PHP命名空间和文件系统目录结构查找并加载PHP类、性状和接口

    为什么自动加载器很重要

    举一个很常见的场景,我们引入文件通常都是采用requireinclude这样的方法,这样的方式简单也可靠,但是如果我们引入一两个还好说,但是当我们一个项目运行时需要引入几十个文件呢,那我们岂不是要写几十个require或者include?这样既不方便,又不美观,所以PHP-FIG在此基础上考虑,规范了一个统一的自动加载器策略;

    如何使用自动加载器

    建议使用依赖管理器Composer自动生成的PSR-4自动加载器。
    现代的PHP框架,laravel、Yii、TP5等都使用了依赖Composer的自动加载器策略,方便我们下载组件和引入合适的类。

    PSR-ME:制定自己的PHP规范

    1. 遵循PSR-1、PSR-2的使用规范
    2. 合适、精简的变量、方法、类命名。能让人看一眼就清楚是做什么的
    3. 尽量编写出高内聚、低耦合的代码
    4. 保持代码结构整洁、美观

    总结

    PHP-FIG推出的PHP规范,并不一定说所有的PHP开发者必须遵守。制定这一规范的目的就是为了,在全世界的PHP开发者在查看代码的时候,能更加简单和轻松。造出来的组件/轮子可以很容易的就被所有开发者熟知和使用,同时也减少了我们的工作投入率,得到更大的工作效率,使产出大于投入,效率更高更快。

    以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里PHP进阶架构师>>>实战视频、大厂面试文档免费获取


    起源地下载网 » PHP-PSR 现代PHPer的开发规范

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元