PSR-4 自动加载器致命错误:找不到类

Posted

技术标签:

【中文标题】PSR-4 自动加载器致命错误:找不到类【英文标题】:PSR-4 autoloader Fatal error: Class not found 【发布时间】:2015-07-20 03:12:30 【问题描述】:

我的项目结构是这样的:

src/
   ├─ Model/
      └─ User.php

我的 User.php 文件如下所示:

<?php
namespace Bix\Model;

class User 

而我的 composer.json 自动加载器是这样的:

"autoload": 
    "psr-4": 
      "Bix\\": "src/"
    
  

最后我的 bootstrap.php 是这样的:

use Bix\Model\User;

// PSR-4 Autoloader.
require_once "vendor/autoload.php";

但是,如果我尝试创建 new User(),则会收到错误 Fatal error: Class 'User' not found in /var/www/public/api/v1/index.php on line 8

查看 composer autoload_psr4.php 文件,它看起来不错:

// autoload_psr4.php @由 Composer 生成

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname(dirname($vendorDir));

return array(
    'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'),
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'KeenIO\\' => array($vendorDir . '/keen-io/keen-io/src'),
    'Bix\\' => array($baseDir . '/src'),
); 

谁能指出我在上面的错误?

【问题讨论】:

【参考方案1】:

首先,Linux(我不确定您使用哪台 PC)区分大小写。在您的自动加载中,您定义了src/bix,而它是src/Bix

但更重要的是,在 PSR-4 中,指定的命名空间前缀包含在目录结构中(以避免目录只包含一个目录)。在你的情况下,如果你配置"Bix\\": "src/",一个类Bix\Model\User应该位于src/Model/User.php


编辑:您误解了 PHP 命名空间。在 PHP 中,您不是说“将 Bix\Model 中的所有内容导入此文件的全局命名空间”与 use Bix\Model;。相反,它的意思是:“将此文件中的Model 别名为Bix\Model”。

所以你应该这样做:

require_once "vendor/autoload.php";

use Bix\Model;

$user = new Model\User();

或:

require_once "vendor/autoload.php";

use Bix\Model\User;

$user = new User();

【讨论】:

我将 composer.json 更新为:“Bix\\”:“src/”并将文件夹结构更新为:src/Model/User.php 但是我仍然收到错误“类”找不到用户' @JeremyKirkham 更新自动加载配置后,您必须运行 composer dump-autoload 来更新自动加载器 我已经这样做了。我用新的文件夹/结构自动加载器更新了我的问题。 采纳你的任何一个建议似乎都不起作用。我已经更新了我的问题以使用您的第二种方法。 感谢您的回答,还补充说,如果您希望自动加载当前目录,您可以这样做:"Foo\\": "" 不包括任何斜杠。

以上是关于PSR-4 自动加载器致命错误:找不到类的主要内容,如果未能解决你的问题,请参考以下文章

Laravel psr-4 不自动加载

Composer 自动加载器在运行测试时找不到 PHPUnit

本地目录自动加载 - “找不到类”

php PSR-4类自动加载器#php #class #autoloader

如何为我的项目创建 PSR-4 自动加载器?

PHPUnit 自动加载器错误:找不到类“Yii”