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

时间:2016-06-17 21:54:07

标签: php namespaces composer-php

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

  1. composer.json文件的“要求”部分指定将从Packagist下载并安装的软件包。 只有“要求”部分中列出的软件包才会出现已下载并安装。
  2. 在步骤1中的下载和安装过程中,在默认的autoload_namespaces.php文件夹(在下载和安装期间在项目的根目录中创建)中创建vendor文件。此文件包含每个下载和安装的包的名称空间定义,该包映射到文件系统上的文件夹
  3. 步骤1中下载的文件中包含的类只能通过autoload_namespaces.php's命名空间访问。如果每个下载的文件都包含与autoload_namespaces.php's个名称之一匹配的NAMESPACE定义。 如果下载的文件中没有名称空间定义,则文件中的类将分配给GLOBAL名称空间。
  4. composer.json文件的“Autoloader”部分仅用于定义自定义命名空间,并将这些自定义命名空间映射到文件系统上的文件夹。已下载和安装的软件包名称空间仅在 autoload_namespaces.php 文件 中定义为 ,并且不受任何影响composer.json的“自动加载器”部分的方式,假设在autoload_namespaces.php“自动加载器”部分中composer.json文件中没有重复出现的NAMESPACE。
  5. 我对上述项目的理解是否正确?如果没有,请你纠正我?

    提前致谢 -

1 个答案:

答案 0 :(得分:1)

你有些不对劲。

ad 1。:

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

ad 2。:

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

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

ad 3。:

如果包没有autoload部分,则无法自动加载任何代码。假设程序包的作者一切正确,可以安全地假设自动加载将正确进行,具体取决于自动加载的类型(PSR-4,PSR-0,类图或文件)。

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

不要假设从包名到命名空间,或从命名空间到文件夹名称的任何连接。在Composer中,所有内容都可以以不同的名称命名(尽管它很容易混淆,这很少是一个好主意),没有强制规则说明名为use WhateverNamespace\Foo; $class = new Foo()的包必须使用名称空间GreatVendor/Awesome或任何名称相同的文件夹布局。使用类映射,任何类都可以托管在任何文件中,一个类可以托管在一个文件中,并且仍然可以使用GreatVendor\Awesome包含代码。

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

ad 4。:

没有“自定义命名空间”。 “风俗”应该是什么意思? include/require(_once)部分必须与编写的代码匹配,您不能使用Composer将代码中的命名空间更改为不同的命名空间。

autoload不是自动加载定义的唯一来源。

Composer将很好地处理重复的命名空间条目。如果有重复的类定义,它必须失败,但只要名称空间前缀只有重叠(如autoload_namespaces.phpGreatVendor使用的GreatVendor\Cache),Composer会告诉他们。