首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >共欺骗/AspectMock父类未被定位器找到

共欺骗/AspectMock父类未被定位器找到
EN

Stack Overflow用户
提问于 2016-12-05 12:15:53
回答 2查看 952关注 0票数 13

我对共欺骗/AspectMock有个问题。在使用自定义自动加载程序并尝试创建具有父级名称空间的类的实例时,我有以下错误:

vendor/goaop/parser-reflection/src/ReflectionEngine.php:112中的定位器找不到InvalidArgumentException:类父类名

我有非常简单的设置:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
namespace lib;

class B extends A {}

类\lib\A:

代码语言:javascript
复制
namespace lib;

class A
{
    public function getName()
    {
        return static::class;
    }
}

类B是通过我的自定义自动加载程序加载的,但是定位器尝试通过编写器自动加载父类A并返回此错误。这是个窃听器还是我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2018-11-07 07:00:36

主题启动器已经得到了一个答案,论GitHub

为了使用自定义的自动加载器,您应该使用复合类定位器重新插入ReflectionEngine,这样可以定位类,或者可以使用带有闭包的CallableLocator来解析路径。 或者,更好的是,您可以将代码基切换到PSR 0/PSR-4。

例如:

代码语言:javascript
复制
$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
票数 7
EN

Stack Overflow用户

发布于 2018-11-12 20:29:53

如果您可以轻松地在代码库上进行查找和替换,也许可以将您的代码重构为PSR-4自动加载标准,并完全消除对自定义自动加载程序的需求。

这是规范https://www.php-fig.org/psr/psr-4/。我会尽量简单地解释。

假设将小写名称空间lib更改为Lib,并将该名称空间设置为composer.json中的src/目录。

代码语言:javascript
复制
"autoload": {
    "psr-4": {
      "Lib\\": "src/"
    }
}

设置之后,运行composer dumpautoload。然后,您所需要做的就是搜索和替换namespace lib;,用namespace Lib;替换。

位于src/Form.php中的示例类的顶部是namespace Lib;,其次是class Form

代码语言:javascript
复制
<?php 

namepace Lib;

class Form
{
  // code
}

命名空间使用文件夹命名约定。src/中的所有类都有名称空间Lib;。如果有子目录,目录名将成为命名空间的一部分。例如,src/Form/Field/Text.php中的文件将具有namespace Lib\Form\Field; class Text {}

代码语言:javascript
复制
<?php 

namepace Lib\Form\Field;

class Text
{
  // code
}

您可以在上面的链接中看到完整的约定,但是一般规则是使任何文件夹都以大写字母开头,就像使用您的类名一样,并且自动加载程序应该能够找到所有的类。

这可能是您的最佳实践解决方案,而且正如我所说的,只需要一点点文件重命名和名称空间调整。祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40974091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档