我对共欺骗/AspectMock有个问题。在使用自定义自动加载程序并尝试创建具有父级名称空间的类的实例时,我有以下错误:
vendor/goaop/parser-reflection/src/ReflectionEngine.php:112中的定位器找不到InvalidArgumentException:类父类名
我有非常简单的设置:
<?php
require_once __DIR__ . '/vendor/autoload.php';
$kernel = AspectMock\Kernel::getInstance();
$kernel->init([
'debug' => true,
'includePaths' => [__DIR__. '/lib'],
]);
$kernel->loadFile(__DIR__ . '/autoload.php'); // custom autoloader
$b = new \lib\B();类\lib\B:
namespace lib;
class B extends A {}类\lib\A:
namespace lib;
class A
{
public function getName()
{
return static::class;
}
}类B是通过我的自定义自动加载程序加载的,但是定位器尝试通过编写器自动加载父类A并返回此错误。这是个窃听器还是我做错了什么?
发布于 2018-11-07 07:00:36
主题启动器已经得到了一个答案,论GitHub。
为了使用自定义的自动加载器,您应该使用复合类定位器重新插入ReflectionEngine,这样可以定位类,或者可以使用带有闭包的CallableLocator来解析路径。 或者,更好的是,您可以将代码基切换到PSR 0/PSR-4。
例如:
$kernel->loadFile(__DIR__ . '/autoload.php'); // custom autoloader
\Go\ParserReflection\ReflectionEngine::init(
new class implements \Go\ParserReflection\LocatorInterface {
public function locateClass($className) {
return (new ReflectionClass($className))->getFileName();
}
}
);
$b = new \lib\B(); // here you go发布于 2018-11-12 20:29:53
如果您可以轻松地在代码库上进行查找和替换,也许可以将您的代码重构为PSR-4自动加载标准,并完全消除对自定义自动加载程序的需求。
这是规范https://www.php-fig.org/psr/psr-4/。我会尽量简单地解释。
假设将小写名称空间lib更改为Lib,并将该名称空间设置为composer.json中的src/目录。
"autoload": {
"psr-4": {
"Lib\\": "src/"
}
}设置之后,运行composer dumpautoload。然后,您所需要做的就是搜索和替换namespace lib;,用namespace Lib;替换。
位于src/Form.php中的示例类的顶部是namespace Lib;,其次是class Form。
<?php
namepace Lib;
class Form
{
// code
}命名空间使用文件夹命名约定。src/中的所有类都有名称空间Lib;。如果有子目录,目录名将成为命名空间的一部分。例如,src/Form/Field/Text.php中的文件将具有namespace Lib\Form\Field; class Text {}。
<?php
namepace Lib\Form\Field;
class Text
{
// code
}您可以在上面的链接中看到完整的约定,但是一般规则是使任何文件夹都以大写字母开头,就像使用您的类名一样,并且自动加载程序应该能够找到所有的类。
这可能是您的最佳实践解决方案,而且正如我所说的,只需要一点点文件重命名和名称空间调整。祝好运!
https://stackoverflow.com/questions/40974091
复制相似问题