乐趣区

关于php:深入学习Composer原理三

本系列第三篇文章,一起理解下 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

退出移动版