使用composer-php来避免依赖关系


Using composer php to avoid the dependency

我在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艺术,您会有四个错误:

  1. composer.json位于src目录中。这是可以的,但是任何与自动加载相关的路径都是相对于composer.json文件的位置的,并且您的自动加载路径中有src,这是错误的。要加载的代码位于bitm目录中
  2. PSR-4前缀必须以反斜杠结尾。作曲家可能已经对此抱怨过了。运行composer validate以查看此错误以及可能更多的错误。正如您已经对内部反斜杠所做的那样,它必须在JSON中进行转义,因此它应该读取"bitm''person''"
  3. PSR-4标准告诉您前缀部分从类名中移除,剩余部分转换为路径。如果您有一个类bitm'person'person和前缀bitm'person,则该类名的其余部分为person,将转换为路径person.php,并假定在composer.json文件中给定的目录中。我已经提到src是错误的,但作为一个例子:Composer会尝试加载文件src/person.php(相对于composer.json的位置)
  4. 虽然PHP类不区分大小写,但是PHP在自动加载时不会转换类名大小写,并且类名会转换为文件名。但是文件系统是区分大小写的(除非您使用的是Windows)。您有一个目录Age,但使用的是名称空间age。这将不匹配。在任何地方都要使用相同的案例

还要注意,您为bitm'person设置了前缀,但没有为bitm'age设置前缀,因此无法自动加载年龄类。您可以在自动加载部分中使用多个前缀,或者使用更通用的bitm前缀来捕获所有类。