composer和psr-4找不到类文件

时间:2017-10-30 10:30:25

标签: php composer-php autoload

我很难理解如何通过psr-4使用自动加载。
在加载流浪汉并设置和测试Homestead.yaml中的所有变量后,我准备了如下文件结构:

\app
   \folder
      -- test.php
   \vendor
       \composer
       -- autoload.php
   -- index.php
   -- composer.json

以下是我的代码:

的index.php

<?PHP 
namespace app;

require('vendor/autoload.php');

$object = new folder\test();

composer.json

"autoload":{
    "psr-4":{
        "app\\": "app"
    }
}

test.php的

<?php 
namespace app\folder;

class test 
{
    function __construct ()
    {
        echo 'construction done right.';
    }
}

但是,在尝试访问该页面后,这些是页面上显示的错误消息:

  

(!)致命错误:未捕获错误:类&#39; app \ folder \ test&#39;在第6行的/home/vagrant/web/sites/app/index.php中找不到   (!)错误:类&#39; app \ folder \ test&#39;在第6行的/home/vagrant/web/sites/app/index.php中找不到

您能帮我理解并解决此错误吗?

4 个答案:

答案 0 :(得分:2)

要修复当前设置,请使用以下命令:

"autoload":{
    "psr-4":{
        "app\\": ""
    }
}

您的composer.json位于app目录中,因此没有名为app的子目录可供参考。

我实际上建议您将目录结构更改为以下内容:

  \app
     \src
     \folder
       -- test.php
       -- index.php
     \vendor
       \composer
         -- autoload.php
     -- index.php
     -- composer.json

然后在composer.json中,设置以下内容:

"autoload":{
    "psr-4":{
        "app\\": "src"
    }
}

这可以确保属于您的应用的所有文件都包含在内。命名空间包含在一个子目录中。

最后,我建议您使用供应商名称空间来防止冲突,并使用PSR-2的命名准则。

答案 1 :(得分:1)

它不起作用,因为您已告知Composer app命名空间中的类位于app子目录中,但没有app子目录。

整个应用程序存储在app目录中,它的名称对应用程序并不重要。 app命名空间的类存储在当前目录中,子命名空间存储在具有相同名称的子目录中。

因此,您的composer.json文件应为:

"autoload": {
    "psr-4": {
        "app\\": ""
    }
}

或者,更清楚一点,您可以将.(当前目录)作为app\命名空间的位置:

"autoload": {
    "psr-4": {
        "app\\": "."
    }
}

在主应用程序目录中进行更改后运行composer dump-autoloader,它将开始工作。

答案 2 :(得分:0)

我认为您不需要PSR-4,只需添加classmap

classmap参数例如:

"autoload": {        
    "classmap": [
        "app"
    ]
}

添加此运行composer dump-autoload后,您应该看到正在添加许多类。

希望这会有所帮助。

答案 3 :(得分:-1)

在composer.json中

尝试设置

"autoload":{
    "psr-4":{
        "": "src/"
    }
}

然后执行此命令

composer dump-autoload -o