idimsh / better-bypass-finals

在源代码中实时移除final关键字,并允许模拟final方法和类

dev-master 2020-10-04 21:40 UTC

This package is auto-updated.

Last update: 2024-09-05 06:27:04 UTC


README

Downloads this Month Build Status License

# 简介 (idimsh) 这是一个著名包 bypass-finals 的重新分发,包含了一些小的修改,包括

  • 使其准备好继承,允许主类的子类继续工作。
  • 代码风格使用空格而不是制表符。
  • 测试不使用Nette Tester,而是使用PHPUnit

原始许可证保持不变,它们都是BSD和GNU。
创建此包的原因是一个未解答的pull request。

简介

在源代码中实时移除final关键字,并允许模拟final方法和类。它可以与任何测试工具(如PHPUnit、Mockery或Nette Tester)一起使用。

安装

推荐通过Composer安装

composer require idimsh/better-bypass-finals --dev

需要PHP版本7.1,并支持PHP至8.0。

使用

只需调用此

\idimsh\BypassFinals::enable();

\idimsh\BypassFinalsCatcher::enable();

在加载要移除final的关键字之前,需要先启用它。因此,最好在加载vendor/autoload.php后尽快调用它。

注意,final内部PHP类,如Closure,无法进行模拟。

您可以选择仅绕过特定文件或目录中的final

idimsh\BypassFinals::setWhitelist([
    '*/Nette/*',
]);

这为您提供了更精细的控制,并可以解决某些框架和库的问题。

phpunit.xml文件内部也有一个PHP Unit监听器可供使用,例如

<phpunit bootstrap="vendor/autoload.php">
    <listeners>
        <listener class="idimsh\BypassFinal\Listener\BypassFinalListener"/>
    </listeners>
</phpunit>

《Catcher》版本

主类的扩展名称为: \idimsh\BypassFinalsCatcher 将捕获语法错误并将文件名输出到STDERR。这对于跨越千个文件的测试很有用,默认行为是静默的致命解析错误,不报告文件名。

还有一个使用catcher的监听器。

<phpunit bootstrap="vendor/autoload.php">
    <listeners>
        <listener class="idimsh\BypassFinal\Listener\BypassFinalCatcherListener"/>
    </listeners>
</phpunit>