如何取消设置函数定义就像我们取消设置变量一样?

时间:2012-01-01 04:48:35

标签: php

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

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

就像我声明一个函数 callMethod()一样,有没有办法取消它?

5 个答案:

答案 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)

来自this question

  

您可以使用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)

一种避免取消设置功能而仍然使用传统功能的解决方案....

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

这样,如果循环遍历代码,则两次调用相同的函数不会有问题。我发现这是一个更整洁的解决方案,它使调用起来更加容易。然后,您可以使用url扩展名来调用函数或类的组。

很明显,这不能满足删除,取消设置或销毁功能的要求,但是它提供了一种可能有用的替代方法。