我在composer的实现中遇到了麻烦。我不了解自动装载编队。我要画出文件目录,然后你们告诉我我是如何将类的目的地形成为自动加载的:
|---------src/
| |-----bitm/
| | |---person/
|person.php
| | |---Age/
|age.php
| |-----vendor/
|----composer
|autoload.php
| |
| |composer.json
| |
| |index.php
以上结构是我在web服务器中的文件夹结构。
以下代码用于composer.json
{
"autoload":{
"psr-4":{
"bitm''person" : "src"
}
}}
以下代码适用于index.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Greeting</title>
</head>
<body>
<?php
/*function __autoload($className){
//var_dump($className);
include_once($className.".php");
}*/
include_once("vendor/autoload.php");
use bitm'person'person;
use bitm'age'age;
$mamun=new person('Mamun');
$age=new age(24);
$mamun->greeting();
$age->personAge();
?>
</body>
</html>
我使用了person.php的命名空间是bitm''person我使用了age.php的名称空间是bitm''age。
我的问题是为什么它显示
致命错误:在第18行的C:''examplep''htdocs''basis_mamun_ewu''mamun''src''index.php中找不到类"bitm''person''person"
如果我正确阅读了您的ASCII艺术,您会有四个错误:
composer.json
位于src
目录中。这是可以的,但是任何与自动加载相关的路径都是相对于composer.json
文件的位置的,并且您的自动加载路径中有src
,这是错误的。要加载的代码位于bitm
目录中- PSR-4前缀必须以反斜杠结尾。作曲家可能已经对此抱怨过了。运行
composer validate
以查看此错误以及可能更多的错误。正如您已经对内部反斜杠所做的那样,它必须在JSON中进行转义,因此它应该读取"bitm''person''"
- PSR-4标准告诉您前缀部分从类名中移除,剩余部分转换为路径。如果您有一个类
bitm'person'person
和前缀bitm'person
,则该类名的其余部分为person
,将转换为路径person.php
,并假定在composer.json
文件中给定的目录中。我已经提到src
是错误的,但作为一个例子:Composer会尝试加载文件src/person.php
(相对于composer.json
的位置) - 虽然PHP类不区分大小写,但是PHP在自动加载时不会转换类名大小写,并且类名会转换为文件名。但是文件系统是区分大小写的(除非您使用的是Windows)。您有一个目录
Age
,但使用的是名称空间age
。这将不匹配。在任何地方都要使用相同的案例
还要注意,您为bitm'person
设置了前缀,但没有为bitm'age
设置前缀,因此无法自动加载年龄类。您可以在自动加载部分中使用多个前缀,或者使用更通用的bitm
前缀来捕获所有类。