【问题标题】:How to unset a function definition just like we unset a variable?如何像取消设置变量一样取消设置函数定义?
【发布时间】:2012-01-31 06:56:56
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么要这样做?这与函数式编程有什么关系?我认为一次性功能完全反对 FP。
  • 我想要的是 get_defined_functions() 的输出不应包含函数“callMethod”的名称。如果有任何其他方法可以做到这一点,请告诉我。
  • 为什么,只是为了好玩?无论您遇到的实际问题是什么,听起来您可能会强制执行错误的解决方案。
  • 我只是想创建一个函数,多次使用它然后消失,这样其他php代码就无法访问它了。这就是我的全部要求。
  • @Forte - 那么如果函数在“消失”后被引用,你期望会发生什么?实际用例是什么?

标签: php


【解决方案1】:

从 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

【讨论】:

  • 使用create_function 创建的函数将保留在内存中。如果你输出变量,你会看到一个字符串。如果您稍后使用该字符串,您将看到该函数仍然有效,尽管您已取消设置变量。所以我想说create_function 模拟你想要的,但不是你想要的。你也可以使用变量函数,也是一样的。
  • 下面还有一个答案。
【解决方案2】:

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

【讨论】:

  • 这里唯一的答案。为什么其他人得到了投票?
  • 这需要PECL,所以不是现成的PHP。不过功能不错。
  • 正确。这是唯一的办法。
  • 从 PHP7 开始,现在称为 runkit7_function_remove
【解决方案3】:

对于怀疑者来说,想要删除一个函数是完全合理的。如果您有一个函数在脚本开头只使用一次大量数据,那么想要删除它是有道理的。

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

这就是说,有一种方法可以解决问题,而无需删除该功能。对于它的价值,将函数使用的所有数组设为全局,然后在函数结束时将它们全部取消。该功能保持不变,但庞大的数据消失了。请注意,当您取消设置变量时,由 PHP 的垃圾收集器决定何时释放内存。释放内存会占用应用程序的 CPU 周期。我真的看不到任何需要取消设置函数的 PHP 脚本。

【讨论】:

  • 你上面的answer呢?有足够的理由吗?我之前也遇到过这个问题。
【解决方案4】:

来自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;

【讨论】:

  • 是的,但他想完全摆脱这个功能。
  • @BoltClock - 我同意你上面的评论。实用性如何?
  • rename_functionAPD 包的一部分,在标准 PHP 安装中不可用。
  • 这不能回答问题。
【解决方案5】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 2011-01-03
    • 2012-01-27
    • 2011-12-12
    • 2014-02-26
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多