我在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 bitmpersonperson;
use bitmageage;
$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标准告诉您前缀部分从类名中移除,剩余部分转换为路径。如果您有一个类
bitmpersonperson
和前缀bitmperson
,则该类名的其余部分为person
,将转换为路径person.php
,并假定在composer.json
文件中给定的目录中。我已经提到src
是错误的,但作为一个例子:Composer会尝试加载文件src/person.php
(相对于composer.json
的位置) - 虽然PHP类不区分大小写,但是PHP在自动加载时不会转换类名大小写,并且类名会转换为文件名。但是文件系统是区分大小写的(除非您使用的是Windows)。您有一个目录
Age
,但使用的是名称空间age
。这将不匹配。在任何地方都要使用相同的案例
还要注意,您为bitmperson
设置了前缀,但没有为bitmage
设置前缀,因此无法自动加载年龄类。您可以在自动加载部分中使用多个前缀,或者使用更通用的bitm
前缀来捕获所有类。