当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是否可以替换(monkeypatch)PHP函数?》经验,为你挑选了3个好方法。

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

>>> def a(): print 1
... 
>>> def a(): print 2
... 
>>> a()
2

例如:


Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1

Silviu G.. 14

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

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

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

    它从当前命名空间中查找函数:A\B\foo().

    它试图找到并调用全局函数foo()


Paolo Bergan.. 9

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

来自manual:

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

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

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


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



1> Silviu G..:

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

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

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

    它从当前命名空间中查找函数:A\B\foo().

    它试图找到并调用全局函数foo()



2> Paolo Bergan..:

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

来自manual:

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

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

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


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



3> jmikola..:

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


非常好的小lib.感谢分享 :)
推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有