重新定义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');