gpt4 book ai didi

php - Composer : What's The Difference Between Require and Autoloader?

转载 作者:行者123 更新时间:2023-12-04 16:51:25 25 4
gpt4 key购买 nike

我刚刚开始使用 Composer。我想确保我正确理解 Composer 在下载和安装软件包时所做的工作 来自 Packagist 使用 Composer 的默认设置。这个对吗:

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

  • 我对上述项目的理解是否正确?如果不是,请您纠正我好吗?

    提前致谢 -

    最佳答案

    你搞错了一些事情。

    广告 1.:

    有一个require-dev除非您使用 --no-dev 阻止此操作,否则也将安装该部分。安装或更新时标记。另请注意,包名称不一定与 Packagist 上发布的内容相关联,您也可以有一个部分 repositories这可以指向替代来源。

    广告2:

    创建任何超出 vendor/autoload.php 的文件是 Composer 内部的,你不应该弄乱它。 Composer 将读取所有 autoload 的定义和 autoload-dev (除非给出 --no-dev)部分并从中编译和适当的自动加载器。这包括具有所有 require 的主要软件和 require-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,具有公共(public)接口(interface)的额外好处,该接口(interface)告诉通用自动加载器如何在需要时查找类。

    广告 4.:

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

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

    关于php - Composer : What's The Difference Between Require and Autoloader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37890913/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com