当前位置: 首页 > 知识库问答 >
问题:

定位器找不到Codecpse/AoodMock父类

桓兴腾
2023-03-14

我有一个问题与代码欺骗/阿瑟莫克。当使用自定义自动加载程序,并试图创建一个类的实例,其中有父形式相同的自定义命名空间我有这个错误:

PHP致命错误:未捕获的InvalidArgumentException:定位器在vendor/goaop/parser reflection/src/ReflectionEngine.PHP:112中未找到类[parent Class name]

我有非常简单的设置:

<?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 {}

Class\lib\A:

namespace lib;

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

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

共有2个答案

印瑾瑜
2023-03-14

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

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

想象一下,将小写命名空间lib更改为Lib,并将该命名空间设置为composer.json中的src/目录:

"autoload": {
    "psr-4": {
      "Lib\\": "src/"
    }
}

设置好后,运行作曲家Dumpautoload。然后您需要做的就是搜索并替换命名空间lib;,替换为命名空间lib;

位于src/Form.php中的示例类将具有名称空间库 在顶部,然后是类表单

<?php 

namepace Lib;

class Form
{
  // code
}

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

<?php 

namepace Lib\Form\Field;

class Text
{
  // code
}

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

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

南门飞扬
2023-03-14

主题启动器已经在GitHub上得到了答案。

为了使用自定义自动加载程序,您应该使用复合类定位器重新初始化ReflectionEngine,该定位器将能够定位您的类,或者您可以使用CallableLocator和闭包来解析路径。

或者,您可以将代码库切换到PSR0/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
 类似资料:
  • 问题内容: 是否有一种优雅的方法来获取我已经发现/识别的Selenium WebElement的“按”定位器? 要明确这个问题:我希望使用“按定位器”来查找元素。在这种情况下,我对特定属性或特定位置(如css-locator) 不 感兴趣。 我知道我可以解析WebElement的toString()方法的结果: 输出例如: [[FirefoxDriver:WINDOWS(....)上的Firefo

  • 有没有一种优雅的方法来获取我已经找到/识别的Selenium WebElement的By定位器? 为了明确这个问题:我想要用于查找元素的“通过定位器”。在这种情况下,我对特定的属性或特定的定位器(如css-locator)不感兴趣。 我知道我可以解析WebElement的toString()方法的结果: 例如,输出为: [[FirefoxDriver:WINDOWS上的firefox(..)]-

  • 问题内容: 我有一个android项目,在其中使用本机代码对SIP进行处理(使用libosip2和libeXosip2)。我的本机代码与库的源代码一起编译到一个模块中。 代码可以正常编译,并且生成的库具有我期望的所有符号,但是当我尝试加载生成的库时,出现以下错误: 我的Application.mk看起来像这样: 我确实使用ndk-depends检查了未捕获的依赖项,这给了我 添加loadLibra

  • 我使用的是Maven 3.6.0,我有Spring Boot Maven项目,其pom文件如下: 出于某种原因,我在我的lib文件夹中发现了以下jarlog4j-1.2.14.jar.我想从我的最终战争中排除这个jar,所以我尝试了mvn依赖项:树,但我找不到父依赖项。 我还试图从Eclipse中打开依赖层次结构,但也找不到这个jar。我怎样才能排除这个罐子?

  • 当我将数据插入到分配表中时,除了硬件和软件值,它们的编码方式与其他值完全相同,其他值都可以正常工作。我就是不明白。 这项工作: 但是,当我尝试包括硬件或软件的值时,例如: 我只得到以下错误:SQL错误:ORA-02291:完整性约束(JAS1224。SYS_C0028418)违反-找不到父密钥02291. 00000-"完整性约束(%s.%s)违反-找不到父密钥"*原因:外键值没有匹配的主键值。*

  • 问题内容: 在我的一项测试中,我正在使用定位元素: 匹配查询的元素不止一个,但是由于我只需要第一个元素,选择器就可以了。 问题是,抛出警告: 警告-为定位器By.cssSelector(“ ul.nav button”)找到了多个元素-将使用第一个结果 是否可以取消警告?换句话说,如何让我知道自己已意识到问题并且不希望再显示警告? 使用开发版本(直接从master分支安装)。 问题答案: 尝试以下