使用PHP eval运行代码导致致命错误:无法重新声明函数

时间:2016-04-29 15:42:15

标签: php eval

我有一个PHP脚本,它从数据库中选择许多PHP代码片段之一,并使用eval执行它。在某些情况下,如果两个代码片段尝试声明一个具有相同名称的函数,我会收到致命错误“无法重新声明函数”。编辑代码片段中的函数名称不是一个选项。有没有办法创建一个范围或者可能有相互覆盖的功能?还是其他更好的想法?

感谢。

编辑:循环此代码。

ob_start();
try {
    $result = eval($source_code);
} catch(Exception $e) {
    echo "error";
}
$error = ob_get_clean();

2 个答案:

答案 0 :(得分:1)

你有三个选择。

function_exists()

// this will check for the function's existence before trying to declare it
if(!function_exists('cool_func')){
    function cool_func(){
        echo 'hi';
    }
}

// business as usual
cool_func();

将函数赋值给变量

// this will automatically overwrite any uses of $cool_func within the current scope
$cool_func = function(){
    echo 'hi';
}

// call it like this
$cool_func();
PHP中的

Namespacing> = 5.3.0

/* WARNING: this does not work */
/* eval() operates in the global space */
namespace first {
    eval($source_code);
    cool_func();
}

namespace second {
    eval($source_code);
    cool_func();
}

// like this too
first\cool_func();
second\cool_func();

/* this does work */
namespace first {
    function cool_func(){echo 'hi';}
    cool_func();
}

namespace second {
    function cool_func(){echo 'bye';}
    cool_func();
}

使用第二个示例,您需要在eval()的每个范围内$cool_func使用一次数据库代码,如下所示:

eval($source_code);

class some_class{
    public function __construct(){
        $cool_func(); // <- produces error
    }
}

$some_class = new some_class(); // error shown

class another_class{
    public function __construct(){
        eval($source_code); // somehow get DB source code in here :)
        $cool_func(); // works
    }
}

$another_class = new another_class(); // good to go

答案 1 :(得分:0)

好吧,正如其他人所说,你应该发布代码,这样我们可以更好地帮助你。但您可能希望研究PHP OOP,因为您可以为类中的方法提供范围并引用它们:

ClassOne::myFunction();
ClassTwo::myFunction();

有关详情,请参阅此处:http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php