";销毁“;PHP 5.2x中的一个函数


"Destroying" a function in PHP 5.2x

可能重复:
在运行时删除PHP 中的函数

我有一个在运行时包含不同文件的脚本。这些文件都包含一个同名的函数。我只需要当前包含的就可以存在。有没有任何方法可以启用动态文件include,这样就不会导致致命错误:无法重新声明function()?换句话说,我需要重命名或删除以前的函数。

该函数以经典的方式声明,函数fn(){;}

if (!function_exists('myFunction')) {
    function myFunction() {
        ....
    }
}

将只定义加载的函数的第一个版本,但除非您使用runkit或apd扩展(或类似的扩展),否则您不能重命名或删除函数

您应该将函数包装在"function_exists"检查中:

if (!function_exists('my_func')){
  function my_func(){
    //...
  }
}

您可以在此处找到更多详细信息:http://php.net/manual/fr/function.function-exists.php

与其每个文件都定义一个同名的顶级函数,不如考虑使用一个非常简单的OO结构:

假设你有这样的东西:

switch ( $some_condition )
{
    case 'normal':
    default:
        include_once 'normal_function.php';
    break;
    case 'special':
        include_once 'special_function.php';
    break;
    case 'secret':
        include_once 'secret_function.php';
    break;
}
do_the_action();

你可以用这样的东西来代替它:

switch ( $some_condition )
{
    case 'normal':
    default:
        include_once 'normal_class.php';
        $handler_object = new Normal_Class();
    break;
    case 'special':
        include_once 'special_class.php';
        $handler_object = new Special_Class();
    break;
    case 'secret':
        include_once 'secret_class.php';
        $handler_object = new Secret_Class();
    break;
}
$handler_object->do_the_action();

然后,在每个包含的文件中,您将定义一个包含该函数的类,而不是一个函数,如下所示:

class Normal_Class
{
    public function do_the_action()
    {
        // Implementation for normal case goes here 
    }
}

这不仅解决了你的问题,还让你走上了学习其他高级OO PHP技术的道路——自动加载文件,这样你就不必每次都指定include_once,定义层次结构和接口等。