我想定义一个函数,并在使用它之后取消设置,就像我们使用变量一样。
$a = 'something';
unset($a);
echo $a; // outputs nothing
就像我声明一个函数 callMethod()一样,有没有办法取消它?
答案 0 :(得分:21)
从PHP 5.3起,您可以为变量分配anonymous function,然后取消设置:
$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
答案 1 :(得分:12)
runkit_function_remove - 删除功能定义 http://php.net/manual/en/function.runkit-function-remove.php
答案 2 :(得分:2)
对于怀疑者来说,想要删除一个功能是完全合理的。如果你的函数在脚本开头只使用了很多数据,那么想删除它是有道理的。
一种这样的功能可以是脚本或框架的移动/平板电脑检测功能。它只需要一次,并且可能会为仅运行一次的函数占用大量内存。如果您有任何疑问,请查看https://github.com/serbanghita/Mobile-Detect/blob/master/Mobile_Detect.json
这就是说,有一种解决问题的方法,而无需删除该功能。为了它的价值,使函数使用的全局所有数组然后在函数的末尾取消它们全部。该功能保持不变,但数据量很大。请注意,当您取消设置变量时,由PHP的垃圾收集器决定何时释放内存。释放内存需要CPU周期远离您的应用程序。我真的看不到任何需要取消设置功能的PHP脚本。
答案 3 :(得分:1)
您可以使用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;
答案 4 :(得分:0)
一种避免取消设置功能而仍然使用传统功能的解决方案....
这样,如果循环遍历代码,则两次调用相同的函数不会有问题。我发现这是一个更整洁的解决方案,它使调用起来更加容易。然后,您可以使用url扩展名来调用函数或类的组。
很明显,这不能满足删除,取消设置或销毁功能的要求,但是它提供了一种可能有用的替代方法。