先行 / 拼凑
PHP 的方法重定义(猴子补丁)功能。
2.1.28
2024-02-06 09:26 UTC
Requires
- php: >=5.4.0
Requires (Dev)
- phpunit/phpunit: >=4
- dev-master
- 2.1.28
- 2.1.27
- 2.1.26
- 2.1.25
- 2.1.24
- 2.1.23
- 2.1.22
- 2.1.21
- 2.1.20
- 2.1.19
- 2.1.18
- 2.1.17
- 2.1.16
- 2.1.15
- 2.1.14
- 2.1.13
- 2.1.12
- 2.1.11
- 2.1.10
- 2.1.9
- 2.1.8
- 2.1.7
- 2.1.6
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.9
- 2.0.8
- 2.0.7
- 2.0.6
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.4.3
- 1.4.2
- 1.4.1
- 1.4.0
- 1.3.5
- 1.3.4
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.9
- 1.2.8
- 1.2.7
- 1.2.6
- dev-feature/php-8.4-replace-trigger-error-use
- dev-feature/php-8.4-remove-e-strict
- dev-feature/139-drop-support-for-hhvm
- dev-add/handle-never-return-type
- dev-void-typed-bug
- dev-readme
- dev-redefinition-of-new
- dev-interception-of-language-constructs
- dev-redefinition-of-internals
This package is auto-updated.
Last update: 2024-09-18 16:38:05 UTC
README
Patchwork 实现了 PHP 中函数和方法的重定义(猴子补丁)。这包括用户定义的和内部的调用者,可以是函数、类方法或实例方法。此外,许多类似函数的结构,如 exit
或 include
,也以类似的方式支持。
内部,Patchwork 使用 file://
上的 流包装器。对于用户定义的函数和方法,它用于在每个这样的调用者开头注入一个简单的拦截器片段。对于其他类型的调用者,应用各种其他策略。
示例:DIY 性能分析器
use function Patchwork\{redefine, relay, getMethod}; $profiling = fopen('profiling.csv', 'w'); redefine('App\*', function(...$args) use ($profiling) { $begin = microtime(true); relay(); # calls the original definition $end = microtime(true); fputcsv($profiling, [getMethod(), $end - $begin]); });
备注
- 方法重定义 是 Patchwork 行为的内部首选隐喻。
restoreAll()
和restore($handle)
分别结束所有重定义或其中之一的生命周期,其中$handle = redefine(...)
。- 闭包
$this
会自动重新绑定到被重定义的方法的封装类。 - 重定义内部
__CLASS__
、static::class
等的行为不考虑隐喻。应使用Patchwork
命名空间中的getClass()
、getCalledClass()
、getMethod()
和getFunction()
。
与测试相关的使用
Patchwork 可以用来模拟静态方法,但这是一种有争议的做法。
应谨慎应用,即在使用其在其他编程语言的陷阱和诱惑之前熟悉它。例如,在 JavaScript、Ruby、Python 以及一些其他语言中,原生对猴子补丁的支持使其测试相关用途比 PHP 中更普遍。
使用猴子补丁的测试通常不再是 单元 测试,因为它们对实现的细节变得敏感,而不仅仅是接口:例如,在从 time()
切换到 DateTime
后,这样的测试可能不再通过。
尽管如此,它们在某些情况下仍有其位置,即唯一的可行替代方案是没有测试。
其他用例
Patchwork 不建议用于 AOP 和其他类型的生产使用。它对应用程序性能的影响可能会非常大。此外,尽管没有已知或预期的特定 Patchwork 相关的安全风险,但请注意,Patchwork 从未考虑用于生产环境。