首页 文章

作曲家:Require和Autoloader之间的区别是什么?

提问于
浏览
2

我刚刚开始使用Composer . 我想确保正确理解Composer在使用Composer的默认值下载和安装包 from Packagist 时所做的工作 . 它是否正确:

  • composer.json 文件的"Require"部分指定将下载和安装的软件包 from Packagist. 仅下载并安装"Require"部分中列出的软件包 .

  • 在步骤1中的下载和安装过程中,将在默认的 vendor 文件夹(在下载和安装期间在项目的根目录中创建)创建 autoload_namespaces.php 文件 . 此文件包含每个下载和安装的包的命名空间定义,该包映射到文件系统上的文件夹

  • 步骤1中下载的文件中包含的类只能通过 autoload_namespaces.php's 命名空间访问,如果每个下载的文件都包含与 autoload_namespaces.php's NAMESPACES中的一个匹配的NAMESPACE定义 . If no namespace definition is present within a downloaded file the classes within the file are assigned to the GLOBAL namespace.

  • composer.json文件的"Autoloader"部分仅用于定义自定义命名空间,并将这些自定义命名空间映射到文件系统上的文件夹 . 已下载和已安装的软件包名称空间定义为 composer.json 并且 composer.json 的"Autoloader"_部分不会以任何方式受到影响,因为 autoload_namespaces.php "Autoloader"部分中没有复制 autoload_namespaces.php 文件中的NAMESPACE .

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

提前致谢 -

1 回答

  • 1

    你有些不对劲 .

    广告1:

    除非您在安装或更新时使用 --no-dev 标志阻止此部分,否则还将安装 require-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:

    没有"custom namespaces" . "custom"在这里应该是什么意思? autoload 部分必须与编写的代码匹配,您不能使用Composer将代码中的命名空间更改为不同的命名空间 .

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

    作曲家会处理重复的命名空间条目 . 如果存在重复的类定义,它必须失败,但只要命名空间前缀只有重叠(如 GreatVendor 正由两个包 GreatVendor\CacheGreatVendor\Db 使用),Composer就会将它们区分开来 .

相关问题