composer自动加载的原理

通过 composer的 install 1命令除了可以下载组件以外,还会在 vendor目录下提供一个自
动加载文件,只需要在项目中通过“ require'vendor/autoload php;”语句引入这个文件,在使
用下载的组件时就可以实现自动加载了。如上一小节的实例中,下载了 monolog组件,就
可以通过“ Smy Log= new \monolog\Logger( wangshuo)”语句直接使用组件中的类库,
而 autoload文件会自动加载相应的类文件。
实现文件自动加载需要有相应的规范进行约束,其中包括PSR0、PSR-4、 classmap和
files四种规范形式,其中PSR4是目前推荐使用的规范。这四种规范形式本质上是定义了
一个命名空间到实际文件的映射关系,通过这个映射关系,可以利用命名空间类精确定位到
相应文件的具体路径,进而实现“ autoload”自动加载功能。首先介绍PSR-0和PSR-4规范,
这两种规范相似。在 composer. ]son文件中可以直接添加 autoload字段实现命名空间到目录
的映射,如 Caravel框架中APP命名空间下类的自动加载设置如下
 

{
    "autoload":{
        "psr-4":{"App\\":"app/"},
        "psr-0":{"Bpp\\":"bpp/"}
    }
}

这里根据PSR-0和PSR4规范定义了两个映射关系,即命名空间“Ap”对应目录“app
和命名空间“Bpp”对应目录“bpp/”。在PSR-4规范下,假设创建一个 app/User. php文
件,则该文件需要包含 App User类,也就是说当使用“ Suser= new \App\Usert0”语句实例
化 App\User类时, autoload会根据定义的PSR4规范到目录app/下查找 User. php文件;在
PSR-0规范下,则需要创建一个 bppBpp/User. php文件,而该文件中包含 BppIUser类。这
里的区别就在于PSR4规范的目录不需要添加命名空间“App”,而PSR0规范的目录需要
添加命名空间“Bpp。
对于 classmap会扫描指定目录中所有的php和inc文件,并加载到 vendor/composer/
autoload classmap. php文件中,在该文件中会实现一个具体类与文件映射的关联数组,也可
以直接精确指定一个文件。通过 classmap可以生成不遵循PSR0和PSR4规范的自动加载
类库。对于下面的实例,就会搜索 database目录下的所有php文件和inc文件,并记录类
名与文件的对应关系。

{
    "autoload":{
        "classmap":["database"]
    }
}


对于在每次程序执行时都需要载入的文件,可以通过fles规范实现自动加载,通常经
常使用的函数库文件就使用这种载入方式,例如下面的实例每次都会加载
 

{
    "autoload":{
        "files":[
            "src/Illuminate/Foundation/helpers.php",
            "src/Illuminate/Support/helpers.php"
        ]
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值