可能重复:
在运行时删除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
,定义层次结构和接口等。