composer的自动加载机制

composer支持四种自动加载的方式:PSR-0 / PSR-4 /Classmap / Files , 其中 PSR-4 是当前推荐的加载方式。

什么是 PSR ?

PSR 是 PHP Standards Recommendations(PHP 标准建议)的缩写

  1. Files 是最简单的加载方式,这种方式不管加载的文件是否用到始终都会加载,而不是按需加载

修改项目根目下的composer.json, 加入 "autoload" 项:

Copy Highlighter-hljs
{ "require": { "monolog/monolog": "1.0.*" }, "autoload": { "files": ["controllers/Controller.php"] } }

需要加载哪个文件,直接写入文件路径即可,路径相对项目的根目录。然后执行composer dump-autoload,该命令可以遍历我们项目根目录以及各依赖库下的 composer.json 文件然后重新生成 vendor/composer/autoload_* 跟自动加载相关的配置文件(运行 composer dump-auto 重新注册自动加载映射关系)。
composer dump-autoload 之后composer会把配置值写入与 Files加载方式对应的 vendor/composer/autoload_files.php 配置文件中。

  1. Classmap 加载方式也很简单,composer会搜寻我们指定的目录或文件,并把搜寻到的结果写到Classmap对应的 vendor/composer/autoload_classmap.php 配置文件中。 修改composer.json :
Copy Highlighter-hljs
{ "require": { "monolog/monolog": "1.0.*" }, "autoload": { "classmap": ["controllers/"] } }

以上配置会让composer搜寻 controllers 目录下的所有类,并生成配置文件,同样先 composer dump-autoload 下

  1. PSR-0 ,这种加载方式已经过时,所以不推荐在新项目中使用,请用 PSR-4 来代替它。
    修改composer.json 如下, 然后执行composer dump-autoload
Copy Highlighter-hljs
{ "require": { "monolog/monolog": "1.0.*" }, "autoload": { "psr-0": {"controllers\\": ""} } }

以上配置的意思是指定 controllers命名空间 所在的父级目录,由于controllers命名空间所在的父级目录就是项目根目录, 所以配置值用 "" ,composer dump-autoload后配置会写入 PSR-0对应的 vendor/composer/autoload_namespaces.php 配置文件中

  1. PSR-4 是 PSR-0 的升级版,是目前推荐的自动加载方式,这种方式使用的是按需加载。

修改composer.json 如下:

Copy Highlighter-hljs
"require": { "monolog/monolog": "1.0.*" }, "autoload": { "psr-4": {"controllers\\": "controllers/"} } }

注意和PSR-0 的 composer.json 做对比,PSR-4 和 PSR-0 的主要区别是,PSR-4指定的就当作当前命名空间的目录, 而PSR-0 指定的是当前命名空间的父目录。composer dump-autoload 一下, 配置会写入PSR-4对应的 vendor/composer/autoload_psr4.php 文件中

--补充--
对于在项目根目录下由开发者自定义的命名空间、类和文件,需要在新增后手动运行 composer dump-auto 命令将其更新到 vendor/composer 目录下相应的自动加载配置中,否则系统将无法找到对应的类和文件。

Copy Highlighter-hljs
composer dump-autoload composer dumpautoload -o

repositories字段属性详解
定制包的仓库地址。

默认的,Composer 只使用 Packagist 仓库。通过指定仓库地址,你可以从任何地方获取包。

仓库不能递归。你只能将它们添加到主的 composer.json 中。所依赖包中 composer.json 文件中的仓库定义是被忽略的。

支持的仓库的类型有:

(1)composer

composer 仓库通过网络提供 packages.json 文件,它包含一个 composer.json 对象的列表,还有额外的 dist 或 source 信息。packages.json 文件通过 PHP 流加载。

(2)vcs

版本控制系统仓库,如:git、svn、hg。

(3)pear

通过它,你可以导入任何 pear 仓库到你的项目中。

(4)package

如果你依赖一个不支持 composer 的项目,你可以定义一个 package 类型的仓库,然后将 composer.json 对象直接写入。

完整的例子:

Copy Highlighter-hljs
{ "repositories": [ { "type": "composer", "url": "http://packages.example.com" }, { "type": "composer", "url": "https://packages.example.com", "options": { "ssl": { "verify_peer": "true" } } }, { "type": "vcs", "url": "https://github.com/Seldaek/monolog" }, { "type": "pear", "url": "http://pear2.php.net" }, { "type": "package", "package": { "name": "smarty/smarty", "version": "3.1.7", "dist": { "url": "http://www.smarty.net/files/Smarty-3.1.7.zip", "type": "zip" }, "source": { "url": "http://smarty-php.googlecode.com/svn/", "type": "svn", "reference": "tags/Smarty_3_1_7/distribution/" } } } ] }
posted @   caibaotimes  阅读(522)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示