使用 composer php 来避免依赖

Using composer php to avoid the dependency

我在 composer 的实现中遇到了困难。我不明白自动加载的形成。我要勾勒出文件目录,然后你们就告诉我如何将 class 的目标形成为自动加载:

|---------src/
|         |-----bitm/
|         |       |---person/
                         |person.php
|         |       |---Age/
                       |age.php
|         |-----vendor/
                  |----composer
                  |autoload.php
|         |

|         |composer.json

|         |  

|         |index.php

以上结构是我在网络服务器中的文件夹结构。

以下代码适用于 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.

我的问题是你们为什么显示

Fatal error: Class 'bitm\person\person' not found in C:\xampp\htdocs\basis_mamun_ewu\Mamun\src\index.php on line 18

如果我正确阅读了你的 ASCII-art,你有四个错误:

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

另请注意,您为 bitm\person 添加了前缀,但没有为 bitm\age 添加前缀,因此您无法自动加载年龄 class。你可以在自动加载部分有多个前缀,或者使用更通用的 bitm 前缀来捕获所有 classes.