问题描述
我正在为我的框架的功能制作一个 Composer 库,但我遇到了这个问题,问题在于使用 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 文件夹的根目录中,我有一个 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"
}
}
}
index.PHP
<?PHP
namespace xenframe\hello;
class App {
function __construct() {
echo "object constructed";
}
}
echo "hello world was loaded";
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,我也没有选择这个,因为有很多冗长。
谢谢!
解决方法
在测试给定代码时,通过将 index.php
中的 src
重命名为 App.php
(与文件中的类名相关)解决了问题。在 "xenframe\\hello\\": "src/"
的 psr-4
部分也使用了 composer.json
。
另外值得一提的是,虽然 composer 无法自动加载所需的类,但由于不符合 PSR-4,composer 没有报告任何错误。
问题是:
- 类的文件名不符合 PSR-4 specifications。来自section 2.3.3
终止类名对应于以 .php
结尾的文件名。文件名必须与终止类名的大小写相匹配。
-
namespace
的psr-4
部分中提到的composer.json
与类文件中使用的namespace
不匹配。来自Composer's PSR-4 Schema
在 psr-4
键下,您定义一个从命名空间到路径的映射,相对于包根。自动加载类 Foo\\Bar\\Baz
时,命名空间前缀 Foo\\
指向目录 src/
意味着自动加载器将查找名为 src/Bar/Baz.php
的文件,如果存在则将其包含。>