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

Posted

技术标签:

【中文标题】本地目录自动加载 - “找不到类”【英文标题】:Local directory autoload - "Class not found" 【发布时间】:2019-02-17 12:54:21 【问题描述】:

我在这里有一个心烦意乱的人,我一定错过了一些东西。我有一个web 目录,其中有两个库作为兄弟目录:

/
  web/
    vendor/
      composer/
        autoload_psr4.php
        ...
      autoload.php
    index.php
  lib-one/
    src/
      A.php
  lib-two/
    src/
      B.php

类文件:

A.php

<?php

namespace Org\LibOne;

class A


    public function __construct()
    

    


B.php

<?php

namespace Org\LibTwo;

class B


    public function __construct()
    

    


我已经运行了composer update,它会生成预期的vendor/composer/autoload_psr4.php 文件:

供应商/作曲家/autoload_psr4.php

<?php

// autoload_psr4.php @generated by Composer

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

return array(
    'Org\\LibOne\\' => array($baseDir . '/../lib-one/src'),
    'Org\\LibTwo\\' => array($baseDir . '/../lib-two/src'),
);

最后,在 web 目录中,我有一个包含以下代码的索引文件:

index.php

<?php

include('vendor/autoload.php');

use Org\LibOne\A;
use Org\LibTwo\B;

$a = new A();
$b = new B();

$a 被分配了一个A 的实例就好了,而$b 错误,说Class 'Org\LibTwo\B' not found in 'web/index.php line 9'

唯一的区别是我在使用Org\LibOne 的代码已经运行之后添加了Org\LibTwo

我对拼写、命名空间、目录等进行了五重检查。请帮助我恢复理智。

【问题讨论】:

AB 示例上实际上可以重现吗?这可能与类名有关(如区分大小写),在这里提供原始名称可能至关重要。 【参考方案1】:

解决了!当然,这是一个简单但经常被忽视的解决方案。在我们的例子中,我们使用 vagrant 开发框rlerdorf/php7dev。文件 php7dev.yaml 包含目录映射,我忘记在其中添加 lib-two,并且过于关注 Composer 是问题的根源。

【讨论】:

以上是关于本地目录自动加载 - “找不到类”的主要内容,如果未能解决你的问题,请参考以下文章

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

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

使用命名空间和自动加载器找不到类

PHPUnit 找不到类

IDEA中Gradle构建失败找不到类路径的解决方法!

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