重新定义PHP函数?

时间:2010-04-14 20:54:35

标签: php function

如果我有一个功能:

function this($a){
   return $a;
}

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

function this($a, $b){  //New this function
   return $a * $b;
}

9 个答案:

答案 0 :(得分:22)

不,这会引发错误:

Fatal error: Cannot redeclare foo()

runkit提供了各种选项,包括runkit_function_rename()runkit_function_redefine()

答案 1 :(得分:22)

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

引用PHP manual on functions

  

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

您可以使用runkit扩展名,但在生产方案中使用runkit通常被认为是值得怀疑的做法。如果您想在运行时交换算法,请查看Strategy patternAnonymous functions

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

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

  

Patchwork是一个PHP库,可以在运行时重新定义用户定义的函数和方法,在纯PHP 5.3代码中松散地复制功能runkit_function_redefine,除此之外,还可以替换静态和私有方法与测试双打。

答案 2 :(得分:10)

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

所以,如果你知道函数 A 可以在其他地方定义,但并非总是如此,你可以像这样包装:

if (!function_exists('A')) {
    function A() {
        // default A implementation
    }
}

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

function A() {
    // another A implementation
}

答案 3 :(得分:1)

我有一个功能库,有时我不想在我测试时调用(通常是数据库更新)。例如,如果我有几个不同的db更新函数,这些函数遍布整个代码。而不是注释掉代码,我只是创建一个特殊的类(例如,类foo {})。定义全局变量(例如,$ DEBUG)和虚拟函数(例如,函数dummy {})。 在foo里面定义你需要模仿的所有(公共静态)函数

$ fn = isset($ DEBUG)? '虚设' :'真正的功能&#39 ;; return call_user_func_array($ fn,func_get_args());

此外,您还可以利用其他功能,例如记录呼叫和参数。

然后用foo :: real_function(...)简单地替换所有对real_function(...)的调用。通常只是一个简单的搜索/替换(或留在那里;取决于函数中发生的事情以及被称为开销的频率可能无关紧要)。

答案 4 :(得分:1)

我有好消息和坏消息。

好消息
有可能(链接如下)。

nadnews
有两个坏消息:

  

By default, only userspace functions may be removed, renamed, or modified. In order to override internal functions, you must enable the runkit.internal_override setting in php.ini.

第二个坏消息:You havbe to sacrifice code readability

示例:

<?php
function this($a){
   return $a;
}

echo this(0);

$f_name = 'this';
$f_args = '$a';
$f_code = 'return $a*$b;';
runkit_function_redefine($f_name, f_args, f_code);

echo this(1,3);

哦,还有一件事,使用this作为函数的名称可能会造成混淆,因为类的对象的方法能够使用this.something来对变量进行reffer方法中的something,与对象本身的变量something具有相同的名称。这是一个例子

<?php
class theclass{
  $a = 'a';
  function a($a){
    echo $a;
    $a = this.$a;
  }
}
theclass $object = new theclass();
$object -> a('b'); // will echo: ab

答案 5 :(得分:0)

您不能同时声明这两个函数,这会产生错误。

答案 6 :(得分:0)

你无法重新声明它。如果您的问题只是重载该示例,那么:

function this($a, $b=1)
{
    return $a * $b;
}

答案 7 :(得分:0)

为您添加的任何新参数设置适当的默认值可能有助于向后兼容,即:

function this($a, $b=1){  //New this function with a sane default.
    return $a * $b;
}

为清楚起见,我还建议一般不要将this用于函数/变量名称。

答案 8 :(得分:0)

您不能重新声明函数,除非运行时黑客攻击,但实际上在各种情况下您可以重新定义它们。即,如果它们存储在变量中。

docker-compose.yml