gpt4 book ai didi

php - 在 PHP 中在运行时删除一个函数(没有 runkit 扩展)

转载 作者:IT王子 更新时间:2023-10-28 23:47:34 27 4
gpt4 key购买 nike

我知道这个问题看起来很奇怪,但是有没有办法在 PHP 中在运行时删除一个函数?

我在“if” block 中声明了一个递归函数,并希望该函数仅在该“if” block 中“有效”。我不希望在这个 block 之外调用这个函数。

我发现 runkit_function_remove但是 runkit在我的 Web 主机上未启用。还有其他方法吗?

顺便说一句,我只支持 PHP 5.1.0。

编辑:我知道我的问题很老套,但这正是我想做的事情:

if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc())
{
function stripslashes_deep($value)
{
return is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
}

$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);

//runkit_function_remove('stripslashes_deep');
}

由于“stripslashes_deep”只有在魔法行情开启时存活,所以我想在完成后将其删除。我不希望人们依赖并不总是存在的功能。我希望现在更清楚了。也欢迎非 hacky 的解决方案建议!

最佳答案

来自PHP Manual on user-defined Functions :

All functions and classes in PHP have the global scope - they can be called outside a function even if they were defined inside and vice versa. [...] PHP does not support function overloading, nor is it possible to undefine or redefine previously-declared functions.

异常(exception)情况是通过 runkit。但是,您可以将函数定义为 anonymous functionunset在你运行它之后,例如

if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc()) {
$fn = create_function('&$v, $k', '$v = stripslashes($v);');
array_walk_recursive(array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST), $fn);
unset($fn);
}

一些评论者正确地指出(但现在在 PHP 中不再是一个问题),您不能在其自身内部调用匿名函数。通过使用 array_walk_recursive,您可以绕过此限制。就我个人而言,我只会创建一个常规函数,而不会费心删除它。它不会伤害任何人。只需给它一个合适的名称,例如 stripslashes_gpc_callback

注意:在评论后进行了编辑和压缩

关于php - 在 PHP 中在运行时删除一个函数(没有 runkit 扩展),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2120044/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com