【问题标题】:Composer PSR-4 autoload is not working after trying multiple methods and tutorials [duplicate]尝试多种方法和教程后,Composer PSR-4 自动加载不起作用 [重复]
【发布时间】:2021-05-21 01:20:27
【问题描述】:

我正在为我的框架的功能制作一个作曲家库,但我遇到了这个问题,问题在于使用 psr-4 自动加载。

我的配置

我有以下结构

├───src
├───test
└───vendor
    ├───composer
    ├───symfony
    │   ├───polyfill-ctype
    │   └───polyfill-mbstring
    │       └───Resources
    │           └───unidata
    ├───twig
    │   └───twig
    │       ├───doc
    │       │   ├───filters
    │       │   ├───functions
    │       │   ├───tags
    │       │   └───tests
    │       └───src
    │           ├───Cache
    │           ├───Error
    │           ├───Extension
    │           ├───Loader
    │           ├───Node
    │           │   └───Expression
    │           │       ├───Binary
    │           │       ├───Filter
    │           │       ├───Test
    │           │       └───Unary
    │           ├───NodeVisitor
    │           ├───Profiler
    │           │   ├───Dumper
    │           │   ├───Node
    │           │   └───NodeVisitor
    │           ├───RuntimeLoader
    │           ├───Sandbox
    │           ├───Test
    │           ├───TokenParser
    │           └───Util
    └───xenframe
        └───hello
            └───src

最后一个文件夹是我的库,里面有 hello 文件夹。

在 hello 文件夹的根目录中,我有一个 composer.json 和一个 src 文件夹。

composer.json

{
    "name": "xenframe/hello",
    "type": "library",
    "license": "MIT",
    "authors": [
        {
            "name": "XENONMC",
            "email": "support@xenonmc.xyz"
        }
    ],
    "minimum-stability": "stable",
    "require": {
    
    
    },
    "autoload": {

      "psr-4": {
      
        "hello\\": "/src"
      
      }

    }

}

src/文件夹里面是主文件->index.php

index.php

<?php

namespace xenframe\hello;

class App {

function __construct() {

echo "object constructed";

}

}

echo "hello world was loaded";

现在,用法在我的根目录index.php

index.php

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$root = str_replace('\\', '/', __DIR__);

// setup composer autoloader
require_once $root . '/vendor/autoload.php';

// visit us as https://xenonmc.xyz

use xenframe\hello\App;

$hi = new App();

我尝试了什么

o) 使用 psr-4 如下"xenframe\\hello": "src/"
o) 使用了类路径,我不喜欢这个,因为 psr-4 是 composer 推荐的标准。
o) 使用 psr-0,我也没有选择这个,因为有很多冗长。

谢谢!

【问题讨论】:

  • 当你运行composer update时,错误是什么...?
  • 它是本地安装的,我没有看到任何错误,我尝试composer dumpautoload 重新生成自动加载composer.json。
  • 我觉得应该是 "xenframe\\hello\\": "xenframe/hello/src/"
  • 哦,我只是在测试你的代码。我必须将index.php 中的src 重命名为App.php,这与文件中的类名有关。还在composer.jsonpsr-4 部分中使用了"xenframe\\hello\\": "src/",它开始工作了。
  • 您尝试过什么使您的代码符合 PSR4 标准?如果给出任何错误消息,请编辑您的问题以包含它 - 我会假设它包含有关问题所在的提示

标签: php composer-php psr-4


【解决方案1】:

在测试给定代码时,通过将src 中的index.php 重命名为与文件中的类名相关的App.php,问题得以解决。还在composer.jsonpsr-4 部分中使用了"xenframe\\hello\\": "src/"

另外值得一提的是,虽然 composer 无法自动加载所需的类,但由于不符合 PSR-4 标准,composer 没有报告错误。

问题是:

  1. 类的文件名不符合PSR-4 specifications。来自section 2.3.3

终止类名对应于以.php 结尾的文件名。文件名必须与终止类名的大小写匹配。

  1. composer.jsonpsr-4 部分中提到的namespace 与类文件中使用的namespace 不匹配。来自Composer's PSR-4 Schema

psr-4 键下,您定义了从命名空间到路径的映射,相对于包根。当自动加载像Foo\\Bar\\Baz 这样的类时,命名空间前缀Foo\\ 指向一个目录src/ 意味着自动加载器将查找一个名为src/Bar/Baz.php 的文件并在存在时包含它。

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 2022-11-12
    • 2014-07-25
    • 2015-04-09
    • 2015-04-20
    • 2015-03-28
    • 2019-04-20
    • 2018-07-25
    • 2014-08-12
    相关资源
    最近更新 更多