idimsh / better-bypass-finals
在源代码中实时移除final关键字,并允许模拟final方法和类
dev-master
2020-10-04 21:40 UTC
Requires
- php: >=7.1
Requires (Dev)
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^7
This package is auto-updated.
Last update: 2024-09-05 06:27:04 UTC
README
# 简介 (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>