我一直在尝试PHP自动加载,但遇到了无法解释的行为。我的目录结构如下:
.
├── src
│ ├── main.php
│ └── Program.php
└── vendor
├── autoload.php
└── Company
└── LibName
└── Lib.php
我用来调用主入口点main.php的工作目录是src。这是我的main.php:
<?php
require_once '../vendor/autoload.php';
var_dump(get_include_path());
$p = new Program();
$l = new \Company\LibName\Lib();
这是我非常简单的自动加载器:
<?php
spl_autoload_register(function ($class) {
$file = str_replace('\\', '/', $class) . '.php';
#echo "checking " . $file . "\n";
#if (file_exists($file)) {
echo "including " . $file . "\n";
include $file;
#}
});
当我在带有PHP 7.0的CLI上运行main.php时,我希望它会引发错误,因为它不能包含类Lib的文件。但是,没有这样的错误,输出只是:
string(16) ".:/usr/share/php"
checking Program.php
including Program.php
constructed program
checking Company/LibName/Lib.php
including Company/LibName/Lib.php
constructed lib
奇怪的是,当我仅在main.php中提供这样的相对名称空间时,这甚至可以工作:
$l = new Company\LibName\Lib();
当我启用检查文件是否在我的自动加载器中时,代码将引发预期的错误,因为没有包含发生。但是我仍然无法解释上述行为。有人有答案吗?