2012-08-14 115 views
3

我知道通过使用eval($code_to_check);我们可以检查这个值是否等于FALSE,如果是的话,我们可以停止执行脚本。然而,我面临的问题是我无法定义一个函数,因为它被调用两次......它通过eval()检查来处理,以确保没有语法错误并且再次处理该函数,但显示一个错误,指出它不能REDECLARE这个函数,因为它已经在eval'd函数中声明了。我怎样才能使它不会在EVAL'd函数中声明,或者我们可以在我们实际调用它之前声明所有在eval()函数中声明的东西...PHP - 检查PHP代码的语法错误而不运行代码

反正,这是我目前的工作......可以使用一些帮助,因为当$ content(这是php代码)中有一个函数时,我得到了“无法重定向函数”。

// PHP Syntax errors? 
if ([email protected]('return true;' . $content)) 
{ 
    // Error found in PHP somewhere. Call error function and return out of here! 
    call_user_func_array($code_error['function'], $code_error['params']); 
    return; 
} 
else 
{ 
    ob_start(); 

    eval($content); 
    $code = ob_get_contents(); 
    ob_end_clean(); 
} 

任何人都可以帮我吗?谢谢你们,你们在这里非常有帮助!您所应得的金牌,但我相信现在奥运会已经结束,这是不太运动尚未...


好吧,我在这里尝试我自己的答案,而这是否会仍然不知道捕获错误并允许同时创建函数而不用两次调用这些函数。这是一个正确的方法吗?任何人都可以在此代码中看到任何可能的问题如果没有检测到语法错误,我在回应$ eval_code ...这样做很好吗?

$eval_code = @eval($content); 
// PHP Syntax errors? 
if ($eval_code === FALSE) 
{ 
    call_user_func_array($code_error['function'], $code_error['params']); 
    return; 
} 
else 
{ 
    ob_start(); 
    echo $eval_code; 
    $code = ob_get_contents(); 
    ob_end_clean(); 
} 
+4

您可以在“lint”模式下运行命令行'php'解释器,以便在将片段存储在临时文件中后检查语法。例如'exec(“php -l checkfile.php.txt”);'可以返回'没有检测到语法错误...' – mario 2012-08-14 01:32:46

+0

不,我通过PHP输入代码到文本区域,并希望它影响页面在我的网站上。有时,我创建了一个函数:'function doSomething($ blah)',但是这样做会执行两次......真的只需要在这里运行eval ...也许如果我为eval()设置了一个php变量,功能??? – 2012-08-14 01:33:32

+1

'eval'不适用于代码检查。它马上运行。那么你可以跳过验证步骤。无论如何,安全方面它是多余的。尽管如此,如果你想在执行用户提供的代码之前声明代码的正确性,还是有用户级的PHP解析器。 (后者是有问题的部分。) – mario 2012-08-14 01:40:17

回答

4
$checkResult = exec('echo \'<?php ' . escapeshellarg($code_to_check) . '\' | php -l >/dev/null 2>&1; echo $?'); 
if ($checkResult != 0) { 
    throw new \RuntimeException("Invalid php"); 
} else { 
    $result = eval($code_to_check); 
} 
+0

为什么你在前面用'\\'写''RuntimeException'?这看起来像一个错误... – 2014-08-01 06:49:30

+1

不,这是正确的。这是PHP – tvlooy 2014-08-03 19:31:04

+0

的命名空间感谢您的好回答。您应该在$ code_to_check上使用escapeshellarg,否则如果php中有任何单引号检查,代码将会失败。 – Matt 2016-10-05 09:36:21

0

如果检查PHP的文档eval(),这是描述:

EVAL - 评估一个字符串作为PHP代码

然而,PHP文件,本身说eval危险构造: 注意

eval()语言结构非常危险,因为它允许 执行任意PHP代码。因此不鼓励它的使用。如果您 已仔细验证除了使用此构造外没有其他选择,请特别注意不要将任何用户提供的数据 加入其中,而不事先对其进行正确验证。

所以,使用eval时要小心,非常小心。现在回到你的问题。

我认为你在这里需要的是一个工具,可以帮助你进行语法检查,以检测违反定义的编码标准。我使用ESLint检查Javascript代码中的违规行为。对于PHP,我使用PHPStorm和Sublime Text,并使用PHP Lint和PHPCS。相反做eval,我建议你使用这些或这些工具的组合来实现你的目标。

如果使用Jetbrains的PHPStorm,你可以在这里找到这些插件:

如果你喜欢用崇高,这里的插件为您提供:

我的观点是,这些很好的结合工具应该足以确保代码的完整性。

-Thanks