Composer psr-4 自动加载问题
Composer psr-4 autoload issue
当我使用 psr-4 自动加载时,我遇到了使用 composer 自动加载的问题,它不起作用并给我错误。
我试过:
$ composer dump-autoload
还有很多其他东西,但没有
就无法工作
require one;
错误:
You are now a master builder, that knows how to autoload with a
classmap!
Fatal error: Uncaught Error: Class 'VegithemesLibraryGreeting' not
found in /home/vaclav/Server/vssk/VSSK/project/aldemo/index.php:10
Stack trace: #0 {main} thrown in
/home/vaclav/Server/vssk/VSSK/project/aldemo/index.php on line 10
composer.json:
{
"autoload": {
"files": ["mylibrary/functions.php"],
"classmap": [
"classmap"
],
"psr-4": {
"one\": "src/"
}
}
}
greeting.php(要加载 class 的文件):
<?php
namespace one;
Class Greeting
{
public function hi()
{
return "We got you covered";
}
}
index.php 文件:
<?php
require 'vendor/autoload.php';
echo lego();
$cm = new Cmautoload;
echo $cm->classmap();
$vt = new oneGreeting;
echo $vt->hi();
将 class 名称的首字母大写通常是一种很好的做法。它还遵守 PSR-1.
的规则
将您的 composer.json 文件更改为如下所示:
{
"autoload": {
"files": [
"mylibrary/functions.php"
],
"classmap": [
"classmap"
],
"psr-4": {
"One\": "src/"
}
}
}
现在,在你的索引文件中。我们将导入自动加载器。要做到这一点只需要它:
require 'vendor/autoload.php';
现在您已经包含了自动加载器,进入每个 class 并设置命名空间。
你的 src/
中的 class == namespace One;
检查 src/
中的 classes 并确保它们都已命名空间。这意味着它们都应该在顶部具有以下代码行:
namespace One;
如前所述,将您的文件名更新为 Foo.php
并将 class 名称更新为
class Foo
坚持 PSR。 (这不是必需的,但强烈推荐和标准程序。)
要使用你的 classes 你会说 use One\Greeting;
$greeting = new Greeting();
echo $greeting->hi(); //"We got you covered"
我找到了问题,缺少:
use One\Greeting;
在很多教程中只字未提。
关于此的另一个相关细节是命名空间必须与文件夹结构相匹配。
如果不是,它会抛出警告。
在我的例子中,文件名是
src/One/GreetingClass.php
但 class 名称是小写的,导致此错误:
class Greetingclass {
将 class 声明更改为 GreetingClass 解决了这个问题。
当我使用 psr-4 自动加载时,我遇到了使用 composer 自动加载的问题,它不起作用并给我错误。
我试过:
$ composer dump-autoload
还有很多其他东西,但没有
就无法工作require one;
错误:
You are now a master builder, that knows how to autoload with a
classmap!
Fatal error: Uncaught Error: Class 'VegithemesLibraryGreeting' not
found in /home/vaclav/Server/vssk/VSSK/project/aldemo/index.php:10
Stack trace: #0 {main} thrown in
/home/vaclav/Server/vssk/VSSK/project/aldemo/index.php on line 10
composer.json:
{
"autoload": {
"files": ["mylibrary/functions.php"],
"classmap": [
"classmap"
],
"psr-4": {
"one\": "src/"
}
}
}
greeting.php(要加载 class 的文件):
<?php
namespace one;
Class Greeting
{
public function hi()
{
return "We got you covered";
}
}
index.php 文件:
<?php
require 'vendor/autoload.php';
echo lego();
$cm = new Cmautoload;
echo $cm->classmap();
$vt = new oneGreeting;
echo $vt->hi();
将 class 名称的首字母大写通常是一种很好的做法。它还遵守 PSR-1.
的规则将您的 composer.json 文件更改为如下所示:
{
"autoload": {
"files": [
"mylibrary/functions.php"
],
"classmap": [
"classmap"
],
"psr-4": {
"One\": "src/"
}
}
}
现在,在你的索引文件中。我们将导入自动加载器。要做到这一点只需要它:
require 'vendor/autoload.php';
现在您已经包含了自动加载器,进入每个 class 并设置命名空间。
你的 src/
中的 class == namespace One;
检查 src/
中的 classes 并确保它们都已命名空间。这意味着它们都应该在顶部具有以下代码行:
namespace One;
如前所述,将您的文件名更新为 Foo.php
并将 class 名称更新为
class Foo
坚持 PSR。 (这不是必需的,但强烈推荐和标准程序。)
要使用你的 classes 你会说 use One\Greeting;
$greeting = new Greeting();
echo $greeting->hi(); //"We got you covered"
我找到了问题,缺少:
use One\Greeting;
在很多教程中只字未提。
关于此的另一个相关细节是命名空间必须与文件夹结构相匹配。 如果不是,它会抛出警告。
在我的例子中,文件名是
src/One/GreetingClass.php
但 class 名称是小写的,导致此错误:
class Greetingclass {
将 class 声明更改为 GreetingClass 解决了这个问题。