Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重新定义PHP函数?_Php_Function - Fatal编程技术网

重新定义PHP函数?

重新定义PHP函数?,php,function,Php,Function,如果我有一个函数: function this($a){ return $a; } 如果我想重新定义函数,它会像重写一样简单吗 function this($a, $b){ //New this function return $a * $b; } 不能同时声明这两个函数,这将导致错误 不,这会引发一个错误: 致命错误:无法重新声明foo() runkit提供了选项,包括和。如果您是指Java意义上的重载,那么答案是否定的,这是不可能的 引述: PHP不支持函数重载,也不可能

如果我有一个函数:

function this($a){
   return $a;
}
如果我想重新定义函数,它会像重写一样简单吗

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

不能同时声明这两个函数,这将导致错误

不,这会引发一个错误:

致命错误:无法重新声明foo()

runkit提供了选项,包括和。

如果您是指Java意义上的重载,那么答案是否定的,这是不可能的

引述:

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

您可以使用
runkit
扩展,但在生产场景中使用runkit通常被认为是可疑的做法。如果希望在运行时交换算法,请查看or

如果重定义的意思是添加到现有的userland函数、重构、替换或重写,那么是的:正如您所展示的那样简单。只需将附加代码添加到函数中,但请确保为向后兼容性设置了默认值

另一个选择是使用

Patchwork是一个PHP库,它可以在运行时重新定义用户定义的函数和方法,松散地复制纯PHP5.3代码中的功能
runkit\u function\u redefinite
,这使您能够用测试双精度替换静态和私有方法


你不能重新申报。如果您的问题只是关于重载该示例,那么:

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

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

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

为了清楚起见,我还建议您通常避免对函数/变量名使用
this

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

因此,如果您知道函数A可以在其他地方定义,但并不总是这样,您可以这样包装它:

if (!function_exists('A')) {
    function A() {
        // default A implementation
    }
}
然后,您只需确保首先遇到所需的实现:

function A() {
    // another A implementation
}

我有一个函数库,有时我只是不想在测试时调用它(通常是数据库更新)。例如,如果我有几个不同的db更新函数,它们都在代码中。我没有注释代码,而是创建了一个特殊的类(例如类foo{})。定义一个全局变量(例如,$DEBUG)和一个伪函数(例如,函数伪{})。 在foo内部定义所有需要模仿的(公共静态)函数

$fn=isset($DEBUG)?'虚拟':'实函数'; 返回调用\u user\u func\u数组($fn,func\u get\u args())

另外,您现在还可以做其他事情,比如记录调用和参数


然后用foo::real_函数(…)替换所有对real_函数(…)的调用。通常只是一个简单的搜索/替换(或者将其留在那里;取决于函数中发生了什么以及调用它的频率,开销可能无关紧要)

我有好消息和坏消息

好消息
这是可能的(以下链接)

最新消息
有两个坏消息:

第二个坏消息是:

例如:

<?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);

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


$action['doSomething'] = function($arguments){
    return 'false';
};

$action['doSomething'] = function($arguments){
    return var_export($arguments,true);
};

echo $action['doSomething']('Hello world');

你为什么要这个?应该命名一个函数来描述它的功能。有两个函数有什么错?我正在修改一个具有已定义函数的核心脚本,而不是直接编辑该函数,我希望包含一个自定义文件,我可以使用该文件根据自己的需要简单地重新定义该函数。在很多情况下,可能需要修改现有函数。例如,当编写测试加倍(或模拟)时;或者在运行时使用猴子补丁库(无需更改库的实际源代码)。事实上,我发现这是PHP最令人沮丧的限制之一,与Ruby或JavaScript等更具动态性的编程语言相反,在这些语言中,这不仅是可能的,而且也是经常发生的。我以为你说的正好相反。另外两张反对票似乎表明,我不是唯一一个这样做的人mistake@Casebash感谢您抽出时间重读答案。谢谢。@Gordon,这些
runkit
扩展非常好用。“通常被认为是可疑的实践”是怎么回事?@Pacerier,因为当函数突然表现出与原始定义不同的行为时,它是不明显的。尤其是对于开发人员非常熟悉的本机函数。你必须知道,有些东西在某处改变了这一点。随着这一点的进一步发展,定义也随之产生。(最近的PHP不关心无条件定义函数的调用/定义顺序。)注意:到目前为止,runkit还没有针对PHP7.0进行更新。现在可以在这里找到PHP7的runkit:替换函数中的$b参数怎么样?runkit重新声明函数调用中也缺少一些$符号。可能值得阅读第二个示例中的PHP文档,该示例也支持闭包函数定义。此代码不回显
ab
@GaretClaborn在哪个版本的PHP中不回显?我这样问是因为php7和php8都改变了很多东西,这意味着一些脚本可能不兼容。

$action['doSomething'] = function($arguments){
    return 'false';
};

$action['doSomething'] = function($arguments){
    return var_export($arguments,true);
};

echo $action['doSomething']('Hello world');