【问题标题】:Composer: What's The Difference Between Require and Autoloader?Composer:Require 和 Autoloader 有什么区别?
【发布时间】:2016-06-17 21:54:07
【问题描述】:

我刚刚开始使用 Composer。我想确保我正确理解 Composer 在使用 Composer 的默认值下载和安装 来自 Packagist 的软件包时所做的事情。这是正确的:

  1. composer.json 文件的“Require”部分指定将从 Packagist下载和安装的软件包。 只有“Require”部分中列出的软件包才会被下载和安装已安装。
  2. 在步骤#1 的下载和安装过程中,会在默认的vendor 文件夹(在下载和安装过程中在项目的根目录中创建)中创建一个autoload_namespaces.php 文件。该文件包含每个下载和安装的包的命名空间定义,该包映射到文件系统上的文件夹
  3. 如果每个下载的文件都包含与autoload_namespaces.php's 命名空间中的一个匹配的命名空间定义,则在步骤#1 中下载的文件中包含的类只能通过autoload_namespaces.php's 命名空间访问。 如果下载的文件中没有命名空间定义,则文件中的类将分配给 GLOBAL 命名空间。
  4. composer.json 文件的“Autoloader”部分仅用于定义自定义命名空间并将这些自定义命名空间映射到文件系统上的文件夹。下载和安装的包命名空间仅在autoload_namespaces.php文件中定义,并且不受任何影响composer.json 的“Autoloader”部分,假设 autoload_namespaces.php 文件中存在的命名空间未在 composer.json“Autoloader”部分中重复。

我对上述项目的理解是否正确?如果没有,请纠正我吗?

提前致谢 -

【问题讨论】:

    标签: php namespaces composer-php


    【解决方案1】:

    你搞错了。

    广告 1.:

    还会安装一个require-dev 部分,除非您在安装或更新时使用--no-dev 标志来防止这种情况。另请注意,包名称不一定与 Packagist 上发布的内容相关联,您还可以有一个部分 repositories 可以指向其他来源。

    广告 2.:

    vendor/autoload.php 之外的任何文件的创建都是 Composer 内部的,你不应该搞砸它。 Composer 将读取所有autoloadautoload-dev(除非给出--no-dev)部分的定义,并从中编译和适当的自动加载器。这包括具有所有 requirerequire-dev 的其他软件包的主要软件。

    根据已定义的自动加载类型,编译的行为会有所不同:PSR-4、PSR-0、类映射或文件。

    广告 3.:

    如果包没有autoload 部分,则无法自动加载任何代码。假设包的作者所做的一切都是正确的,那么可以放心地假设自动加载将正确进行,具体取决于自动加载的类型(PSR-4、PSR-0、类映射或文件)。

    一个包可以包含多个用于自动加载的条目,并且可以负责多个命名空间。 autoload_namespaces.php 中的条目主要与一般理解 Composer 自动加载无关:一个包定义了一些自动加载,一个软件需要该包,包括 vendor/autoload.php,开发人员从文档中知道有一个类 WhateverNamespace\Foo 并且简单使用它:$class = new WhateverNamespace\Foo()use WhateverNamespace\Foo; $class = new Foo()

    不要假设从包名到命名空间,或从命名空间到文件夹名有任何联系。在 Composer 中,所有东西都可以用不同的方式命名(尽管这很令人困惑,这很少是一个好主意),没有强制规则规定名为 GreatVendor/Awesome 的包必须使用命名空间 GreatVendor\Awesome 或任何名为像那样。使用类映射,任何类都可以托管在任何文件中,甚至可以将一个类托管在单个文件中,并且仍然可以使用include/require(_once) 包含代码。

    一般情况下,任何最近的包都将坚持 PSR-4 或至少 PSR-0 并使用命名空间。但请注意,这源于代码本身,而不是 Composer。 Composer 只会执行定义的自动加载定义并采取相应的行动,它不会神奇地干扰更改命名空间或其他东西。它仍然是基本的 PHP,还有一个公共接口的额外好处,它告诉通用自动加载器如何在需要时找到一个类。

    广告 4.:

    没有“自定义命名空间”。这里的“定制”应该是什么意思? autoload 部分必须与编写的代码匹配,您不能使用 Composer 将代码中的命名空间更改为不同的命名空间。

    autoload_namespaces.php 不是自动加载定义的唯一来源。

    Composer 可以很好地处理重复的命名空间条目。如果定义了重复的类,它肯定会失败,但只要命名空间前缀只有重叠(例如 GreatVendor 被两个包 GreatVendor\CacheGreatVendor\Db 使用),Composer 就会区分它们。

    【讨论】:

    • 非常感谢您花时间告诉我我对 Composer 的遗漏!我打算再给这个问题几天。不过,我怀疑我会选择您的答案作为首选答案。
    • 再次感谢@Sven 的回答。很有帮助!
    猜你喜欢
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    • 2013-08-19
    相关资源
    最近更新 更多