gpt4 book ai didi

php - PHP中的猴子补丁

转载 作者:可可西里 更新时间:2023-11-01 13:55:41 25 4
gpt4 key购买 nike

我正在尝试弄清楚猴子补丁是如何工作的,以及如何让它在我自己的对象/方法上工作。

我一直在看这个库,它做的正是我自己想做的: https://github.com/antecedent/patchwork

用它你可以从一个对象中重新定义一个方法。为此,它使用了“猴子补丁”技术。但我无法通过查看源代码真正弄清楚到底发生了什么。

假设我有以下对象:

//file: MyClass.php
namespace MyClass;

class MyClass {

public function say()
{
echo 'Hi';
}
}

我想做这样的事情:

Monkeypatch\replace('MyClass', 'say', function() {
echo 'Hello';
});

$obj = new MyClass();
$obj->say(); // Prints: 'Hello'

但我不确定如何编写实际修补部分的代码。我知道在这种情况下 namespace 很重要。但这究竟是如何让我修补某个方法的呢?我是否需要在某处使用 eval()(如果需要,如何使用)?

我真的找不到关于这件事的任何好的例子,除了: http://till.klampaeckel.de/blog/archives/105-Monkey-patching-in-PHP.html

但我真的不知道如何将其应用到我自己的对象/方法中。我希望有一个很好的解释或例子。

最佳答案

http://till.klampaeckel.de/blog/archives/105-Monkey-patching-in-PHP.html的情况下真正不同的是在第二个 strlen 前面使用的 \ 字符。

当您使用命名空间时,您可以使用命名空间并直接调用命名空间中声明的方法/类:

use TheNamespace;
$var = new TheClass();

或者通过使用类似的东西显式地调用类:

$var = new\TheNamespace\TheClass();

因此,通过调用 \strlen() 而不是 strlen(),您明确要求 PHP 使用默认的 strlen 而不是为此命名空间定义的 strlen。

至于猴子补丁,您可以使用 runkit ( http://ca.php.net/runkit )。此外,关于拼凑,他们的网站 (http://antecedent.github.com/patchwork/docs/examples.html) 中有大量示例。您可以查看替换类中函数的魔术方法示例。

关于php - PHP中的猴子补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com