本系列第三篇文章,一起了解下PSR规范中的PSR4和PSR0规范

首先恭喜大家,包括我自己,坚持到了现在。这篇文章之后,Composer的基础原理就清晰明了咯。也就是说,Composer所利用的正是spl_autoload_register()和PSR4规范,然后通过线上服务器存储包,来实现包管理的功能。spl_autoload_register()的作用我们已经清楚了,主要就是动态加载我们所需要的文件。然而我们的文件不可能都乱七八糟的随便找个目录放下,然后注册一堆的spl_autoload_register()来加载吧,要真这么写,估计你的老板会废了你。在这个时候,PSR路径规范的作用就显示出来咯!!

本文参考PSR规范:https://psr.phphub.org/

PSR4的格式

\<命名空间>(\<子命名空间>)*\类名

具体的内容直接上文中提供的参考链接,这里总结重要的几点:

  • 顶级命名空间必须有一个
  • 子命名空间可以多个或没有
  • 类名必须有
  • 大小写敏感,下划线无实际意义(注意,下划线是主要的和PSR0的区别)

类名与文件载入的对应

  • 去掉最前面的命名空间的分隔符,前面的命名空间作为[命名空间前缀],必须与至少一个[文件基目录]对应
  • 子命名空间与[文件基目录]下的文件夹对应,命名空间分隔符号作为目录分隔符号
  • 末尾的类名,与最终目录下的对应的.php文件相同
  • autoload的实现不可出现异常,也就是要解决掉异常问题

估计各位看得一脸懵逼吧!!

其实很好理解,举例说明,我们先建立一个目录叫myvendor,里面放着常用的工具包,如图:

那么TestClass.php的命名空间应该是Test,而CaseClass的应该是CaseModel\CaseChild。统一从myvendor这个文件夹作为入口进入。也就是myvendor是一个超级[基目录],然后Test和CaseModel是对应命名空间的两个[文件基目录],剩下的子个名空间与目录对应。官网中还有其他的展示方式,但在这里我们用这种最标准的方式。

其实说白了,就是命名空间和目录对应上,写代码找文件就方便得很啦!!

上面说的是PSR4的规范,那么PSR0又是什么鬼?目前来说PSR0已经废弃了,它们两个大部分内容还是相近的,最大的区别在于PSR0中的_这个符号是有意义的,也就是/namespace/package/Class_Name这样的内容,会去提供/namespace/package/Class/Name.php文件,而PSR4中则忽略_这个符号的意义,还是去查找Class_Name.php这个文件。

TestClass.php代码

<?php

namespace Test;

class TestClass
{
public function show()
{
echo "we are family!\n";
}
}

CaseClass.php代码

<?php

namespace CaseModel\CaseChild;

class CaseClass
{
public function show()
{
echo "Good!\n";
}
}

接下来,在myvendor目录外面添加一个psr4.php文件,代码如下:

<?php

spl_autoload_register(function ($class) {
$vendor = __DIR__ . '/myvendor';
$file = $vendor . '/' . str_replace('\\', '/', $class) . '.php';
if (file_exists($file)) {
require $file;
}
}); use CaseModel\CaseChild\CaseClass;
use Test\TestClass; $t = new TestClass();
$t->show(); $c = new CaseClass();
$c->show();

神奇的事情发生了,文件自动加载进来了,有点高大上吧,至此,关于Composer的自动加载部分就结束了。我们一起学习到了PHP是如何通过spl_autoload_register方法来自动加载文件,并且通过PSR4规范来形成约束,让大家都有一套统一的规范。而这些,正是Composer的灵魂和肉身。

完整源码:https://github.com/zhangyue0503/php-blog-code-resource/tree/master/composer/base/psr4namespace

===============

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

深入学习Composer原理(三)的更多相关文章

  1. 深入学习Composer原理(四)

    本系列第四篇文章,也是最后一篇 首先,我们先看看Composer的源码从哪里看起.当然,请您先准备好源码. composer init或者直接install之后,自动生成了一个vendor目录,这时您 ...

  2. 深入学习Composer原理(一)

    Composer作为PHP的包管理工具,为PHPer们提供了丰富的类库,并且让PHP重焕新生,避免被时代淘汰的悲剧.可以说,Composer和PHP7是现在PHP开发者的标配,如果你还没用过Compo ...

  3. 深入学习Composer原理(二)

    本系列的第二篇文章,这次我们聊聊:spl_autoload_register()函数 PHP的SPL库作为扩展库,已经于5.3.0版本后默认保持开启,成为PHP的一组强大的核心扩展库.大家有时间可以多 ...

  4. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...

  5. MATLAB地图工具箱学习总结(三)地图工具箱的基本知识

    MATLAB地图工具箱学习总结(三)地图工具箱的基本知识 今天想要介绍的是一些比较基础的函数.了解了这些函数,地图投影的基本概念才能真正明白.而要想继续研究MATLAB中有关地图投影的函数,尤其是未来 ...

  6. 学习Python的三种境界

    前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...

  7. Laravel学习笔记(三)--在CentOS上配置Laravel

    在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚.     今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下.     1)系统 ...

  8. (转载)CSS3与页面布局学习总结(三)——BFC、定位、浮动、7种垂直居中方法

    目录 一.BFC与IFC 1.1.BFC与IFC概要 1.2.如何产生BFC 1.3.BFC的作用与特点 二.定位 2.2.relative 2.3.absolute 2.4.fixed 2.5.z- ...

  9. Java命令学习系列(三)——Jmap

    Java命令学习系列(三)——Jmap 2015-05-16 分类:Java 阅读(479) 评论(0) Jmap jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件.远程调试服 ...

随机推荐

  1. 快速从SQL语法过度到Elasticsearch的DSL语法

    目录 前言 bool-相当于一个括号 should-相当于or must-相当于and must_not-相当于 ! and term-相当于= terms-相当于in between-相当于rang ...

  2. Windows Go 开发环境下载、安装并配置

    前言 对于我们Windows用户而言,Go提供两种环境安装方式(源码安装除外): 1.MSI安装(MSI文件是Windows Installer的数据包,它实际上是一个数据库,包含安装一种产品所需要的 ...

  3. WPF Grid新增框选功能

    有时候会有框选的需求,类似EXCEL一样,画一个框选择里面的子控件. 选择后比如可以将子控件的Border设置为红色边框 说下这个功能的大致原理.背景是一个Grid,比如里面放了很多的Button.  ...

  4. Java中Byte类型数据在运算中的问题

    比如: byte a=1; byte b=2; byte c; c=a+b; //这样是计算不出c,是错误的 c=a+1; //这样也是不能计算c的 c=64+1; //为什么这样就能计算c,在Jav ...

  5. ES6基础之let、const

    es6的块级作用域通俗的讲就是一对花括号中的区域(声明对象的花括号不是块级作用域),块级作用域可以嵌套. let: 1.le声明的变量只在当前(块级)作用域内有效. 2.let声明的变量不能被重复声明 ...

  6. Kickstart无人值守原理及简介

    原文转自:https://www.cnblogs.com/itzgr/p/10029461.html作者:木二 目录 一 简介及原理 二 搭建无人值守步骤 三 PXE介绍 四 Kickstart简介 ...

  7. k8s笔记0528-基于KUBERNETES构建企业容器云手动部署集群记录-6

    1.创建一个测试用的deployment [root@linux-node1 ~]# kubectl run net-test --image=alpine --replicas=2 sleep 36 ...

  8. python 逆序按行读取文件

    How to read a file in reverse order? import os def readlines_reverse(filename): with open(filename) ...

  9. 一、Git分布式版本控制系统

    1.引入 在开发一个软件项目时,本地只有几十行代码或几百行代码时还可以维护,但当代码达到一定的数量后或两三个人共同开发一个项目时,就很容易会出现代码混乱.冲突.排错难等问题.一旦开发完工以后发现整个项 ...

  10. 快速构建CLI程序并发布到PyPi

    构造一个简单的CLI程序 typer 这个从去年就被各种营销号吹成Web框架的 第三方库, 与 FastAPI 同出一人之手,它不是Web框架,它是一个用来构建CLI程序的库,我们就简单搞个例子 # ...