<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Composer on Leanku 的博客</title><link>https://www.leanku.com/tags/composer/</link><description>Recent content in Composer on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 15 Nov 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://www.leanku.com/tags/composer/index.xml" rel="self" type="application/rss+xml"/><item><title>composer</title><link>https://www.leanku.com/post/php/composer/</link><pubDate>Tue, 15 Nov 2022 00:00:00 +0000</pubDate><guid>https://www.leanku.com/post/php/composer/</guid><description>&lt;h1 id="composer"&gt;&lt;a href="https://www.phpcomposer.com/"&gt;composer&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Composer是 PHP 用来管理依赖（dependency）关系的工具。你可以在自己的项目中声明所依赖的外部工具库（libraries），Composer 会帮你安装这些依赖的库文件。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="一composer-基础概念"&gt;一、Composer 基础概念&lt;/h2&gt;&#10;&lt;p&gt;Composer 是 PHP 的依赖管理工具，它通过定义项目所需的依赖包及版本，自动安装和管理这些依赖，确保项目在不同环境下都能稳定运行。其核心概念主要包括以下几个方面：&lt;/p&gt;&#10;&lt;h3 id="11-包package"&gt;1.1 包（Package）&lt;/h3&gt;&#10;&lt;p&gt;包是 Composer 管理的基本单元，它可以是一个 PHP 类库、框架组件，或是某个功能模块。比如用于 HTTP 请求处理的 Guzzle，以及知名的 PHP 框架 Laravel、Symfony 等，都可以看作是 Composer 包。这些包被发布在 Packagist 等包仓库中，方便开发者获取使用。&lt;/p&gt;&#10;&lt;h3 id="12-composerjson-与-composerlock"&gt;1.2 composer.json 与 composer.lock&lt;/h3&gt;&#10;&lt;p&gt;composer.json是项目的依赖配置文件，开发者在其中定义项目所需的依赖包及其版本约束。例如，若要在项目中使用 PHPUnit 进行单元测试，可在composer.json添加 &amp;ldquo;phpunit/phpunit&amp;rdquo;: &amp;ldquo;^9.5&amp;rdquo; ，表示使用 PHPUnit 9.5 及以上版本，但低于 10.0 版本。​&lt;/p&gt;&#10;&lt;p&gt;composer.lock则是锁定依赖包具体版本的文件。当执行composer install或composer update时，Composer 会将实际安装的依赖包版本记录在composer.lock中。下次在其他环境安装依赖时，该文件能确保安装的依赖包版本与之前完全一致，避免因版本差异导致项目出现兼容性问题 。&lt;/p&gt;&#10;&lt;h3 id="13-包仓库repository"&gt;1.3 包仓库（Repository）​&lt;/h3&gt;&#10;&lt;p&gt;包仓库是存储 Composer 包的地方，默认情况下，Composer 使用 Packagist 作为官方包仓库，它汇聚了海量的 PHP 开源包。除了 Packagist，开发者还可以搭建私有包仓库，用于管理内部开发的私有包，或者使用其他公共仓库，拓展包的来源。&#10;&lt;a href="https://packagist.org/"&gt;packagist仓库地址&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="二安装composer"&gt;二、&lt;a href="https://pkg.xyz/#how-to-install-composer"&gt;安装composer&lt;/a&gt;&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#下载安装脚本 － composer-setup.php － 到当前目录。&#10;php -r &amp;#34;copy(&amp;#39;https://install.phpcomposer.com/installer&amp;#39;, &amp;#39;composer-setup.php&amp;#39;);&amp;#34;&#10;&#10;#执行安装过程。&#10;php composer-setup.php&#10;&#10;#删除安装脚本。&#10;php -r &amp;#34;unlink(&amp;#39;composer-setup.php&amp;#39;);&amp;#34;&#10;&#10;#全局安装&#10;sudo mv composer.phar /usr/local/bin/composer&#10;&#10;#启用本镜像服务&#10;composer config -g repo.packagist composer https://packagist.phpcomposer.com&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="三-composer常用命令与操作"&gt;三、 Composer常用命令与操作&lt;/h2&gt;&#10;&lt;h3 id="31-初始化项目"&gt;3.1 初始化项目&lt;/h3&gt;&#10;&lt;p&gt;在新建 PHP 项目时，首先需要初始化 Composer。在项目根目录下打开命令行，执行composer init命令，此时会进入交互式配置界面，系统会依次询问项目名称、描述、作者、许可证等信息。完成信息填写后，会在项目根目录生成composer.json文件。如果不想进行交互式配置，也可以使用composer init -n命令，采用默认配置快速生成composer.json文件。&lt;/p&gt;</description></item><item><title>Composer 自动加载原理</title><link>https://www.leanku.com/post/php/composer-%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD%E5%8E%9F%E7%90%86/</link><pubDate>Tue, 15 Nov 2022 00:00:00 +0000</pubDate><guid>https://www.leanku.com/post/php/composer-%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD%E5%8E%9F%E7%90%86/</guid><description>&lt;h1 id="composer-自动加载原理"&gt;&lt;a href="https://www.phpcomposer.com/"&gt;Composer &lt;/a&gt;自动加载原理&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Composer 的自动加载本质是 动态加载类文件，它实现了“按需加载”的机制，避免了手动 require 每个类文件。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="一composer-自动加载的核心"&gt;一、Composer 自动加载的核心&lt;/h2&gt;&#10;&lt;p&gt;PHP 提供了 spl_autoload_register() 函数：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;spl_autoload_register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;src/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\\&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.php&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;当你第一次使用一个类时，PHP 会调用这个函数。&lt;/li&gt;&#10;&lt;li&gt;$class 是你使用的类全名（包括命名空间）。&lt;/li&gt;&#10;&lt;li&gt;函数里通过规则找到对应文件并 require。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Composer 自动加载，就是在这个基础上做了 规范化管理。&lt;/p&gt;&#10;&lt;h2 id="二composer-生成的自动加载文件"&gt;二、Composer 生成的自动加载文件&lt;/h2&gt;&#10;&lt;p&gt;安装依赖后，Composer 会生成：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;vendor/autoload.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;vendor/composer/autoload_*.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;vendor/autoload.php：入口文件，只需 require 一次。&lt;/li&gt;&#10;&lt;li&gt;vendor/composer/autoload_psr4.php：记录 PSR-4 命名空间 → 文件路径映射。&lt;/li&gt;&#10;&lt;li&gt;vendor/composer/autoload_classmap.php：记录 类名 → 文件路径，用于 classmap 加速加载。&lt;/li&gt;&#10;&lt;li&gt;vendor/composer/autoload_files.php：记录需要立即加载的文件（如全局函数库）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;vendor/autoload.php 的核心逻辑：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="no"&gt;__DIR__&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/composer/autoload_real.php&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ComposerAutoloaderInit&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="na"&gt;getLoader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ComposerAutoloaderInit::getLoader() 会：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;初始化一个 ClassLoader 实例。&lt;/li&gt;&#10;&lt;li&gt;根据配置注册 PSR-4、PSR-0、classmap、files 自动加载函数到 PHP。&lt;/li&gt;&#10;&lt;li&gt;调用 spl_autoload_register() 注册这些函数。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="三psr-4-自动加载机制"&gt;三、PSR-4 自动加载机制&lt;/h2&gt;&#10;&lt;p&gt;PSR-4 是 Composer 默认的推荐机制。&#10;假设 composer.json 配置：&lt;/p&gt;</description></item></channel></rss>