【发布时间】:2019-12-05 00:54:01
【问题描述】:
我有一个 PHP 项目,它加载一个名为 custom_funcs.php 的引导文件,该文件位于 Web 根目录中。这个文件包含一堆函数,定义了几个常量,并且做了以下事情:
require dirname( __DIR__ ) . '/lib/php/vendor/autoload.php';
spl_autoload_register( function ($class_name) { include __DIR__ ."/classes/$class_name.php"; });
set_include_path( get_include_path() . PATH_SEPARATOR . SITEROOT );
第一行加载 Composer 自动加载器。 (请注意,作曲家库位于根 Web 目录之外)。第二行告诉我的代码在哪里寻找无法识别的类,这样我就不必经常手动加载我曾经使用过的类文件。第三行将 Web 根目录添加到 PHP 的 PATH 中。
这几年来一直运行良好,还有几个 Composer 包。
然后...我安装了 PhpUnit。总的来说,我可以正常工作,除非我运行测试:
- 如果没有错误,则正常工作。
- 如果出现错误,我还会收到 PHP 警告:
Warning: include(C:\...path_to_web_root.../classes/SebastianBergmann\Invoker\Invoker.php): failed to open stream: No such file or directory in C:\...path_to_web_root...\common_funcs.php on line 14
Warning: include(): Failed opening 'C:\...path_to_web_root.../classes/SebastianBergmann\Invoker\Invoker.php' for inclusion (include_path='xxxxxxx') in C:\...path_to_web_root...\common_funcs.php on line 14
所以 PhpUnit 正在尝试自动加载一个名为“Invoker”的类,但代码使用的是我自己的由 spl_autoload_register 设置的自动加载路径。
有没有办法解决这个问题?这是 PhpUnit 中的错误吗?
我可以通过在包含行之前使用“@”来隐藏错误,但我会不惜一切代价避免@hiding 错误
注意:我在通过以下方式进行测试之前加载custom_funcs.php:
public static function setUpBeforeClass(): void {
require 'common_funcs.php';
}
文件结构可能会更清楚:
c:/some_path/
..lib/
....php/
......vendor/
........(third-party Composer libraries)
..webroot/
....custom_funcs.php
....classes/
......(namespace)/
........(my custom classes)
我正在使用命名空间:MyCompany\Portal。所以我的自定义类在<webroot>/classes/MyCompany/Portal/
【问题讨论】:
-
将您的 custom_func 设为一个类并将其添加到 PSR4 自动加载器。见getcomposer.org/doc/01-basic-usage.md#autoloading
-
这听起来很像“重写你的输入代码库”。除了一些值得注意的(和最近的)例外,这是一个完全程序化的遗留系统。
custom_funcs.php没有什么可以构成一个有凝聚力的、明智的 Object 类——它是我在整个站点中使用的一堆可重用函数。 -
“第二行告诉我的代码在哪里寻找无法识别的类,这样我就不必经常手动加载我曾经使用过的类文件。”这正是作曲家的用途。我不完全理解这里的问题?将您自己的类添加到作曲家自动加载器并删除该行。
-
如果有办法用 Composer 自动加载器替换我的 spl_autoload_register 调用,我愿意接受这个想法,但要了解 Composer 和自定义类位于两个不同的位置。或者你的意思是我应该把我的自定义类放在 Composer 的供应商文件夹中?
-
您是否在自己的类文件中使用命名空间?如果是,您可以教作曲家在哪里可以找到这些命名空间。 (请参阅我第一条评论中的链接)他们可以随心所欲地坐在任何地方(只要它们可读)。
标签: php composer-php phpunit autoload spl-autoload-register