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

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

谢谢。</ p>

编辑:循环此代码。</ p>

   ob_start(); 
try {
$ result = eval($ source_code);
} catch(Exception $ e){
echo“error”;
}
$ error = ob_get_clean();
< / code> </ pre>
</ div>

展开原文

原文

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

douzhi0107
douzhi0107 你去吧
4 年多之前 回复
dtlygweb2017
dtlygweb2017 从评估中脱手!
4 年多之前 回复
dongmu1989
dongmu1989 如果你发布了一些代码,我们可能会提供帮助,否则如果没有重命名函数或将其移到类中,你可能会运气不好。您也可以使用function_exists
4 年多之前 回复
duanca3415
duanca3415 我可以看到代码非常好!你不是通灵者吗?得到它:-)
4 年多之前 回复
dongyuyi5680
dongyuyi5680 我们能看到你真正想做的事吗?
4 年多之前 回复

2个回答

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
doubao6464
doubao6464 太好了! 您的困境实际上让我深入了解命名空间,如果您想避免在磁盘上创建临时文件(磁盘访问时间最慢),那么我建议您查看回复我帖子的人的包含部分:stackoverflow.com / questions / 36945327 / ...但你必须确保你的php.ini文件中的allow_url_fopen = On和allow_url_include = On。 如果你想切换回eval(),那么答案也会涵盖。
4 年多之前 回复
douzi1991
douzi1991 我做到了。 我使用include()而不是eval()。 我只是创建一个包含在唯一命名空间中的PHP代码的临时文件。
4 年多之前 回复
douyan0732
douyan0732 看起来命名空间示例没有按预期工作,因为eval()似乎在全局范围内运行,而cool_func()无法重新声明。 我完全没有想法...感谢您向我展示将PHP代码放入数据库中充满了危险: - /
4 年多之前 回复
doubianyan9749
doubianyan9749 那么聘请程序员。
4 年多之前 回复
duanhuan2301
duanhuan2301 再次看我的编辑。 另外,我无法在我的测试中使用选项4,因此NVM关于类选项。
4 年多之前 回复
dsw8292301
dsw8292301 使用命名空间调用函数我需要在函数名之前包含命名空间。 由于函数是在代码片段内创建和调用的,因此需要我编辑代码片段。
4 年多之前 回复
doukengzi3517
doukengzi3517 不,不是名字空间; 您只需要更新PHP代码如何从数据库中调用eval()的函数。 我添加了第四个选项btw
4 年多之前 回复
douzhaishan5462
douzhaishan5462 但是,并非所有这些解决方案都需要编辑数据库中的代码片段吗?
4 年多之前 回复
dougou3871
dougou3871 请看我的编辑:-)
4 年多之前 回复
duannai5879
duannai5879 有1000多个代码片段。 没有办法编辑每一个。 即使函数具有相同的名称也不意味着它们执行相同的操作,因此我无法使用!function_exists
4 年多之前 回复



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

  ClassOne :: myFunction(); 
ClassTwo :: myFunction ();
</ code> </ pre>

更多信息请参阅: http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php </ p>
</ div>

展开原文

原文

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

dongzi5673
dongzi5673 然后我猜你被搞砸了,因为你不能声明两个具有相同名称的函数在PHP中的相同作用域中运行。 如果您不想编辑任何代码,您希望如何解决问题?
4 年多之前 回复
dongnuo2879
dongnuo2879 有1000多个代码片段。 我无法编辑每一个。 这需要几个月的时间。
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐