composer-php - psr-0 与 composer 自动加载不起作用,但它与 psr-4 自动加载完美配合

标签 composer-php psr-4 psr-0

我尝试使用 PSR-0 自动加载文件,但它不会自动加载该文件。我用 PSR-4 自动加载尝试了相同的文件。使用 PSR-4,它可以完美运行。 PSR-0 所需的文件夹结构有什么不同吗?

即使保留 What is the difference between PSR-0 and PSR-4? 中提到的文件夹结构,我也无法使 PSR-0 工作

这是我的文件夹结构。

Test
    --Package
        --Test.php

我在 Test.php :
<?php
namespace Test\Package;

class Test
{
    public function __construct()
    {
        echo "In Test class";
    }
}

composer.json好像
{
  "autoload": {

    "psr-0": {
            "Test\\Package\\": "Test/Package/"
             }
  }
}

最佳答案

与直觉相反,the composer documentation on PSR-0包含一个部分路径,这使得 PSR-0 似乎需要一个包的路径才能加载类。实际上,PSR-0 是基于包构建路径的,因此如果代码位于像 src/ 这样的文件夹中,它只需要指定一个路径。或 lib/这不是命名空间路径的一部分。如果基于命名空间的目录结构在与 composer.json 相同的目录中开始,则不需要路径。

假设问题中指定了一个目录结构,有几种方法可以使用 composer.json 加载此类。

PSR-0

{
  "autoload": {
    "psr-0": { "Test\\Package\\": "" }
  }
}

请注意,即使代码位于 Test/Package/ , 这个文件夹是 不是 在 PSR-0 中指定。

PSR-4

对于 PSR-4 自动加载,包源的路径必须出现在 composer.json 中。文件。
{
  "autoload": {
    "psr-4": { "Test\\Package\\": "Test/Package/" }
  }
}

类图

当需要加载未组织到典型命名空间文件夹树中的类时,也可以使用 classmap 简单地指定要在其中搜索类的文件夹列表。大批。
{
  "autoload": {
    "classmap": [ "Test/Package/" ]
  }
}

但是,一般而言,使用 PSR-0 或 PSR-4 将提供更轻松的体验,如 classmap方法要求单独指定每个文件夹。

关于composer-php - psr-0 与 composer 自动加载不起作用,但它与 psr-4 自动加载完美配合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38091718/

相关文章:

php - Composer(php的库管理器)生成的vendor目录在linux和windows中是否相同?

php - 使用 composer 和 PSR-0 自动加载命名空间

php - 在 Laravel 中加载 Composer 类

PHPUnit 和 Composer : [InvalidArgumentException] Command "path/to/test" is not defined

PHP 测试在本地通过,但在使用 Composer、PSR-4 自动加载的 Travis CI 上失败

php - Composer 自动加载 psr-4 未将命名空间添加到 autoload_psr4.php

php - 如果 classmap 实际上更快,为什么要在 composer 中使用 PSR-0 或 PSR-4 自动加载?

php - PSR-0 找不到类

git - 可以配置 Composer 使用 http 而不是 git clone git@

composer-php - PSR-4和类映射自动加载之间的区别?