猴子修补在PHP中

w00*_*w00 5 php monkeypatching

我试图找出猴子修补的工作原理以及我如何使它适用于我自己的对象/方法.

我一直在看这个lib,它确实是我想做的事情:https: //github.com/antecedent/patchwork

有了它,您可以从对象重新定义方法.它使用'猴子补丁'技术.但是我无法通过查看源代码来确定究竟发生了什么.

所以假设我有以下对象:

//file: MyClass.php
namespace MyClass;

class MyClass {

    public function say()
    {
        echo 'Hi';
    }
}
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

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

$obj = new MyClass();
$obj->say();  // Prints: 'Hello'
Run Code Online (Sandbox Code Playgroud)

但我不知道如何编码实际的修补部分.我知道在这种情况下命名空间很重要.但是,这究竟是如何让我修补某种方法呢?我是否需要在某处使用eval()(如果是这样,如何)?

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

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

mob*_*ius 3

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

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

use TheNamespace;
$var = new TheClass();
Run Code Online (Sandbox Code Playgroud)

或者通过使用类似以下内容显式调用该类:

$var = new \TheNamespace\TheClass();

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

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