如何像取消变量设置一样取消函数定义


How to unset a function definition just like we unset a variable?

我想定义一个函数,并在它使用后取消设置,就像我们对变量所做的那样。

$a = 'something';
unset($a);
echo $a; // outputs nothing

就像这样,如果我声明一个函数callMethod(),有办法取消设置吗?

从PHP 5.3开始,您可以将匿名函数分配给变量,然后取消设置:

$upper = function($str) {
    return strtoupper($str);
};
echo $upper('test1');
// outputs: TEST1
unset($upper);
echo $upper('test2');
// Notice: Undefined variable: upper
// Fatal error: Function name must be a string

在5.3之前,您可以对create_function()

执行类似的操作
$func = create_function('$arg', 'return strtoupper($arg);');
echo $func('test1');
unset($func);
$func2 = "'0lambda_1";
echo $func2('test2.a'), "'n"; // Same results, this is the "unset" $func function
echo $func('test2.b'); // Fatal Error

runkit_function_remove - 删除函数定义http://php.net/manual/en/function.runkit-function-remove.php

对于持怀疑态度的人来说,想要删除一个函数是完全合理的。如果你有一个函数在脚本开始时使用了大量数据,那么想要删除它是有意义的。

这种类型的功能可能是脚本或框架的移动/平板检测功能。它只需要一次,并且对于只运行一次的函数可能会占用大量内存。如果您有任何疑问,请查看https://github.com/serbanghita/Mobile-Detect/blob/master/Mobile_Detect.json

也就是说,有一种方法可以解决这个问题,而不需要删除函数。无论如何,将函数使用的所有数组设置为全局,然后在函数结束时将它们全部取消设置。功能保留了,但大量的数据消失了。请注意,当您取消设置变量时,由PHP的垃圾收集器决定何时释放内存。释放内存会减少应用程序的CPU周期。

从这个问题:

可以使用rename_function

<?php
rename_function('original_name', 'new_name' );
?>

,然后重新声明原函数。
Override_function也可以工作。

它们是Zend PHP调试器的一部分,如果这不起作用,那么你可以尝试这样做:

function function1(){
 echo "1";
}
function function2(){
 echo "2";
}
$i = "function2";
$i(); //  displays 2;

避免取消函数设置而仍然使用传统函数的解决方案....

  1. 将函数放入单独的文件
  2. 使用require_once函数调用文件

这样,如果你循环遍历代码,你就不会遇到两次调用同一个函数的问题。我发现这是一个更简洁的解决方案,它使调用更容易。然后你可以使用url扩展来调用函数或类的组。

显然,这并没有回答删除、取消设置或销毁函数的请求,但它提供了一种可能被证明有用的替代方法。