使用composer php来避免依赖

时间:2015-12-12 16:52:50

标签: php namespaces composer-php autoloader

我被困在作曲家的实施中。我不了解自动加载的形成。我将绘制文件目录的草图,然后人们告诉我如何将类的目的地组成自动加载:

|---------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。

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

  

致命错误:班级&#39; bitm \ person \ person&#39;在第18行的C:\ xampp \ htdocs \ basis_mamun_ewu \ Mamun \ src \ index.php中找不到

1 个答案:

答案 0 :(得分:1)

如果我正确读取您的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。这不符合。始终在任何地方使用相同的案例。
  5. 另请注意,您为bitm\person创建了前缀,但未为bitm\age创建前缀,因此您无法自动加载年龄类。您可以在自动加载部分中使用多个前缀,或使用更通用的bitm前缀来捕获所有类。