您的位置:首页 >  新闻中心 > 云通讯公告
  云通讯公告
 

Composer实现PHP中类的自动加载

来源:原创    时间:2017-10-25    浏览:0 次

Composer是PHP针对PHP言语的第三方的依靠办理东西,将工程所用到的依靠文件包括在composer.json文件中,运用composer install指令就能够将所运用对应库或许文件加载进工程里边。下面分两部分介绍composer的根底,别离是composer的依靠办理和主动加载。

  依靠办理

  在composer呈现之前,如果咋PHP项目中需求第三方的依靠文件,则需求程序员将所需求的源代码复制进工程中或许将源代码对应的文件下载下来手动增加到工程中。如果所需求的依靠文件依靠于更多的第三方文件,则程序员会堕入复制依靠文件的黑洞中,费时吃力不说,有可能还会呈现一些失误,composer就是在这种情况下呈现的用于减轻程序员的关于依靠办理的担负的东西。

  Composer经过运用装备文件composer.json文件完结依靠办理。composer.json文件包括了项目的简略介绍、项目关于外界的库或文件的依靠。从composer.json的扩展名就能够看得出来,composer.json中的内容是依照json标准安排的。本篇博客会集在类的主动加载机制上,因而关于composer.json中关于项目的作者等相关信息的解说疏忽不解说。

  在composer中将本项目所需求的外部依靠包写在要害字require对应的值中,require键能够对应着多个所需求的包,各个不同的包之间用逗号分隔。假定项目需求一个外部依靠包monolog,下面是在compose.json文件中关于monolog包的依靠装备项:



如上所示,require要害字将会映射包的称号monolog和包的版别1.0.*。其间,包的称号有两部分组成,中心以“/”分隔,“/”之前代表的包的所有者,在Github上一般是代表的Github的用户名,“/”代表的是实践的包的称号。其间“/”之前的称号有必要是仅有的,可是"/"之后的包的称号是能够存在重复的,例如“Jack/monolog”和“monolog/monolog”是能够共存的。然后面的"1.0.*"代表的是所依靠的包的版别,其间“*”代表的是“1.0”之下的恣意一个版别,例如:1.0.1,1.0.2或许1.0.9等等。“@dev”代表了能够获取该包的开发版别。默许情况下,composer将获取所需求的包的最新的安稳版别,而不会考虑开发版别,由于开发版别一般是不太安稳的版别。可是,如果断定开发版别没有什么问题就能够加上“@dev”以答应获取开发的版别。如果没有加上“@dev”,而除了开发版别之外不存在其他版其他话,则composer加载依靠项犯错。

  在composer中装备好依靠的第三方的包之后,就能够运用composer install指令获取第三方的包了。运转成功之后就能够项目中就会呈现vendor文件夹,vendor文件夹中会包括我们在require中所列出的monolog文件。

  出了生成列在composer.json中要害字require值下的文件之外,成功运转composer install之后还会生成对应的composer.lock文件,该文件依据composer.json中的依靠项生成依靠包对应的版别。这儿需求阐明的是,在我们运转composer install的时分会首要判别是否存在着composer.lock文件。如果原本就存在这composer.lock文件,那么就会直接依据composer.lock中的版别下载对应的包,此刻不再理睬composer.json中的装备项。如果不存在composer.lock文件,则依据composer.json文件中的装备下载对应的版别,并生成composer.json对应的composer.lock文件。composer.lock又称为确定文件,生成对应的composer.lock之后,composer.json和composer.lock共同对版别进行操控。有了composer.lock之后,及时有了新的版别也不会触发新版其他更新,除非手动运用composer update指令进行手动的更新。

  开发环境下的依靠

  有的时分我们只是在开发的时分才会依靠于某个详细的包,可是在发行的版别中并不需求这样的包,为了到达这种要求能够运用require-dev引进开发环境下的包依靠。如下:



主动加载类

  经过composer.json或许composer.lock,所依靠的第三方库现已被下载下来了,那么在我们的项目中怎样运用这些第三方库呢?最简略的办法就是经过include或许require将所需求的类文件包括进来,可是这种办法需求我们自己去寻觅所运用的类对应的类文件,这就存在和PHP言语中直接运用include和require加载所需求的类存在相同的坏处,一种比较简略的办法当然就是运用composer供给的类的主动加载机制了。类似于PHP的主动加载机制,composer供给了autoload完成类的主动加载。

  成功运转composer install之后,只需调用生成的vendor目录下的autoload.php文件就能够调用经过composer.json加载的类了。以上面所述的项目中需求monolog包为例,经过能够经过下面的办法运用monolog包中的Logger类。  



当然,除了运用第三方库中供给的类之外,还能够运用自己的界说的类。Composer供给了autoload要害字用于加载我们自己供给的类,假设我们界说了一个有关测验的类,如下:



将该类放在lib目录下的ClassTest.php文件夹下面,那么怎样让composer加载自己界说的类呢?


  1. 在composer.json中参加autoload要害字  



files键对应的值是一个数组且改值是相关于文件运用根目录的文件的途径。在composer.json中参加上述的要害字之后,在指令行下运转composer dump-autoload就能够让composer重建加载信息,那么就能够在其他的文件中运用这个类了。

  上述所述的办法和PHP中直接运用include和require存在一样的坏处,每个类都需求从头书写加载文件,费时吃力。

  2. composer.json中参加classmap要害字

  比较于每个类文件都需求加载一次的做法,运用classmap要害字,能够削减程序员的担负,只需求将文件地点的目录增加在classmap的值中即可,如下: 



其实这需求树立一品种名到类地点的文件的映射联系。当需求相应的类的时分,composer经过类名找到对应的类文件名,将相应的类include进来。可是这相同存在一个问题就是,每增加一个类都需求从头运转一次composer dump-autoload从头创立类名到文件之间的映射联系,然后将对应的类加载进来。尽管比files要害字节省了功夫,可是仍然不能彻底主动加载所需求的类。

  3. 根据PHP标准的主动加载办法

  针对PHP这种编程言语,到现在FIG指定了五个标准,别离如下:

PSR0:主动加载;
PSR1:根本代码标准;
PSR2:代码款式标准;
PSR3:日志接口标准;
PSR4:主动加载标准;
  看上去PSR4与PSR0是重复了,可是PSR4标准比较洁净,能够当作PSR0标准的升级版。二者最重要区别在于:PSR0标准中,下划线会被转换为目录分隔符,可是PSR4中下划线不具有特别的意义。二者都是经过特定的目录、文件名以及类名,完成快速查找到类文件,并将相应的类加载进来。

  PSR0和PSR4要求有个命名的空间,对上述的ClassTest类做相应的修正如下:  



那么对应的文件的途径应该改为libClassTestLibClassTest.php,此刻修正composer.json中的autoload如下:


可能你发现psr0的值有一些古怪,是的。在这儿ClassTestLib代表的是命名空间,而"lib"是目录名。加载对应的类文件的时分,查找的途径是lib/ClassTestLib,而不是ClassTestLib/lib,这是在书写composer.json的时分需求留意的一点。

  如果命名空间中存在着“”,则在书写对应的composer.json的时分需求在相应的“”再增加一个“”。例如,如果命名空间改为ClassTestLib,相应的对应与运用根目录的途径称号应该变为libClassTestLibClassTest.php,对应的composer.json中的autoload应该变为: