尝试多种方法和教程后,Composer PSR-4 自动加载无法正常工作
Composer PSR-4 autoload is not working after trying multiple methods and tutorials
我正在为我的框架的功能制作一个 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 文件夹。
在 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) 使用了 class 路径,我不喜欢这个,因为 psr-4 是 composer 推荐的标准。
o) 使用 psr-0,我也没有选择这个,因为它太冗长了。
谢谢!
在测试给定代码时,通过将 src
中的 index.php
重命名为与文件中的 class 名称相关的 App.php
来解决问题。在 composer.json
.
的 psr-4
部分也使用了 "xenframe\hello\": "src/"
另外值得一提的是,虽然 composer 无法自动加载所需 class,但由于 PSR-4 不合规,composer 没有报告任何错误。
问题是:
- class 的文件名不符合 PSR-4 specifications. From section 2.3.3
The terminating class name corresponds to a file name ending in .php
. The file name MUST match the case of the terminating class name.
composer.json
中 psr-4
部分提到的 namespace
与 class 文件中使用的 namespace
不匹配。来自 Composer's PSR-4 Schema
Under the psr-4
key you define a mapping from namespaces to paths, relative to the package root. When autoloading a class like Foo\Bar\Baz
a namespace prefix Foo\
pointing to a directory src/
means that the autoloader will look for a file named src/Bar/Baz.php
and include it if present.
我正在为我的框架的功能制作一个 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 文件夹。
在 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) 使用了 class 路径,我不喜欢这个,因为 psr-4 是 composer 推荐的标准。
o) 使用 psr-0,我也没有选择这个,因为它太冗长了。
谢谢!
在测试给定代码时,通过将 src
中的 index.php
重命名为与文件中的 class 名称相关的 App.php
来解决问题。在 composer.json
.
psr-4
部分也使用了 "xenframe\hello\": "src/"
另外值得一提的是,虽然 composer 无法自动加载所需 class,但由于 PSR-4 不合规,composer 没有报告任何错误。
问题是:
- class 的文件名不符合 PSR-4 specifications. From section 2.3.3
The terminating class name corresponds to a file name ending in
.php
. The file name MUST match the case of the terminating class name.
composer.json
中psr-4
部分提到的namespace
与 class 文件中使用的namespace
不匹配。来自 Composer's PSR-4 Schema
Under the
psr-4
key you define a mapping from namespaces to paths, relative to the package root. When autoloading a class likeFoo\Bar\Baz
a namespace prefixFoo\
pointing to a directorysrc/
means that the autoloader will look for a file namedsrc/Bar/Baz.php
and include it if present.