重新定义PHP函数?

Mic*_*ael 36 php function

如果我有一个功能:

function this($a){
   return $a;
}
Run Code Online (Sandbox Code Playgroud)

如果我想重新定义函数,它会像重写它一样简单吗?

function this($a, $b){  //New this function
   return $a * $b;
}
Run Code Online (Sandbox Code Playgroud)

Ann*_*rom 23

不,那会引发一个错误:

Fatal error: Cannot redeclare foo()
Run Code Online (Sandbox Code Playgroud)

runkit提供选项,包括runkit_function_rename()runkit_function_redefine().

  • PHP 7 的 runkit 现在可以在这里找到:https://github.com/runkit7/runkit7 (2认同)

Gor*_*don 22

如果你的意思是在Java意义上的重载,那么答案是否定的,这是不可能的.

在函数上引用PHP手册:

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

您可以使用runkit扩展,但在生产场景中使用runkit通常被认为是值得怀疑的做法.如果要在运行时交换算法,请查看策略模式匿名函数.

如果通过重新定义你的意思是添加到现有的userland函数,重构,替换或重写,那么是:它就像你所显示的一样简单.只需将其他代码添加到该函数中,但请确保为向后兼容性设置了默认值.

另一种选择是使用http://antecedent.github.io/patchwork

拼布是一个PHP库,能够在运行时重新定义用户定义的函数和方法,松散的复制功能runkit_function_redefine在纯PHP 5.3的代码,其中,除其他事项外,让你可以使用测试双打代替静态和私有方法.


rus*_*tyx 10

您不能在PHP中重新定义或"取消定义"函数(不使用第三方模块).但是,您可以有条件地定义函数.

所以,如果你知道函数A可以在别处定义,但并非总是如此,你可以像这样包装它:

if (!function_exists('A')) {
    function A() {
        // default A implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需要确保首先遇到所需的实现:

function A() {
    // another A implementation
}
Run Code Online (Sandbox Code Playgroud)