本地目录自动加载 - “找不到类”
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
。
我对拼写、命名空间、目录等进行了五重检查。请帮助我恢复理智。
【问题讨论】:
在A
和 B
示例上实际上可以重现吗?这可能与类名有关(如区分大小写),在这里提供原始名称可能至关重要。
【参考方案1】:
解决了!当然,这是一个简单但经常被忽视的解决方案。在我们的例子中,我们使用 vagrant 开发框rlerdorf/php7dev。文件 php7dev.yaml
包含目录映射,我忘记在其中添加 lib-two
,并且过于关注 Composer 是问题的根源。
【讨论】:
以上是关于本地目录自动加载 - “找不到类”的主要内容,如果未能解决你的问题,请参考以下文章