是否可以替换(monkeypatch)PHP函数?

gak*_*gak 17 php monkeypatching function

你可以用Python做到这一点,但它可以用PHP吗?

>>> def a(): print 1
... 
>>> def a(): print 2
... 
>>> a()
2
Run Code Online (Sandbox Code Playgroud)

例如:

<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1
Run Code Online (Sandbox Code Playgroud)

Sil*_*u G 14

有点晚了,但我只想指出,自PHP 5.3以来,实际上可以在不使用PHP扩展的情况下覆盖内部函数.

诀窍是您可以在命名空间内重新定义内部PHP函数.它基于PHP为函数命名解析的方式:

在命名空间内(比如A\B),在运行时解析对非限定函数的调用.以下是对函数foo()的调用如何解决:

  1. 它从当前命名空间中查找函数:A\B\foo().
  2. 它试图找到并调用全局函数foo()

  • 我还在 SO...接受! (2认同)

Pao*_*ino 9

不,不可能像你期望的那样做到这一点.

来自manual:

PHP不支持函数重载,也不可能取消定义或重新定义以前声明的函数.

但是,你可以使用runkit_function_redefine和它的表兄弟,但它绝对不是很优雅......

你也可以create_function用来做这样的事情:

<?php
$func = create_function('$a,$b','return $a + $b;');
echo $func(3,5); // 8
$func = create_function('$a,$b','return $a * $b;');
echo $func(3,5); // 15
?>
Run Code Online (Sandbox Code Playgroud)

与runkit一样,它不是很优雅,但它提供了您正在寻找的行为.


jmi*_*ola 5

我意识到这个问题有点陈旧,但Patchwork是最近发布的PHP 5.3项目,它支持重新定义用户定义的函数.但是,正如作者所提到的,你需要使用runkitphp-test-helpers来修补核心/库函数.

  • 非常好的小lib.感谢分享 :) (2认同)