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

I have a PHP script that selects one of many PHP code snippets from the database and executes it using eval. In some cases if two code snippets try to declare a function with the same name, I get the fatal error "cannot redeclare function". Editing the function names in the code snippets is not an option. Is there some way to create a scope or maybe have the functions overwrite each other? Or any other better ideas?

Thanks.

Edit: Loops this code.

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

You have three choices, really.

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();

Assign function to a variable

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

// call it like this
$cool_func();

Namespacing in PHP >= 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();
}

With the second example you would need to eval() the DB code once within every scope which you need to use $cool_func, see below:

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

Well, as mentioned by others, you should post the code so we can better help you. But you may want to look into PHP OOP as you can give scope to methods within classes and reference them as such:

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

See this for more: http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php