PHP - 在不运行代码的情况下检查 PHP 代码是否存在语法错误


PHP - Check PHP Code for Syntax Errors without running the code

我知道通过使用eval($code_to_check);我们可以检查该值是否等于FALSE,如果是,我们可以停止脚本的执行。 但是,我面临的问题是我无法定义一个函数,因为它被调用了两次...... 它使用 eval() 检查进行处理以确保没有语法错误,然后再次处理该函数,但显示一个错误,指出它无法重新声明此函数,因为它已经在 eval'd 函数中声明。 我怎样才能做到我们不在 EVAL 函数中声明东西,或者也许我们可以在实际调用它之前取消声明在 eval() 函数中声明的所有内容......

无论如何,这是我到目前为止正在使用的... 可以使用一些帮助,因为当$content(这是 php 代码)中有一个函数时,我得到了一个"无法重新声明函数"。

// PHP Syntax errors?
if (!@eval('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();
}
$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);
}

您还可以使用一个新的但非常流行且稳定的工具 PHPStan 进行此类检查。

在这里,您可以阅读一个简短的教程,如何使用它。

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

eval — 将字符串评估为 PHP 代码

然而,PHP文档本身说eval是一个危险的结构:谨慎

eval() 语言结构非常危险,因为它允许 执行任意 PHP 代码。因此,不鼓励使用它。如果你 已经仔细验证了除了使用它之外别无选择。 构造,特别注意不要传递任何用户提供的数据 在没有事先正确验证的情况下进入它。

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

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

如果您使用的是 Jetbrains PHPStorm,您可以在此处找到这些插件:

  • https://www.jetbrains.com/help/phpstorm/2016.2/using-php-code-sniffer-tool.html
  • https://plugins.jetbrains.com/plugin/7887?pr=phpStorm我个人更喜欢使用PHPStorm,它确实是最好的PHP IDE之一。

如果您更喜欢使用Sublime,这里有适合您的插件:

  • https://github.com/SublimeLinter/SublimeLinter-php
  • https://github.com/SublimeLinter/SublimeLinter-phplint
  • https://github.com/benmatselby/sublime-phpcs

我的观点是,这些工具的良好组合应该足以确保代码的合理性。

-谢谢

我找到了一种在测试自动化中一次检查所有 php 文件语法的方法。如果您的 php 文件仅包含函数和数据(在没有参数的情况下不执行任何不需要的操作),则可以使用它。

我得到了我的 php 文件列表,我为每个 php 文件生成一个带有一个 IFrame 的 html 页面。我有我的自定义 PHP 错误处理程序将所有错误放入数据库,因此将文件包含在 IFrame 中就足够了。如果存在错误(包括语法错误),则会记录该错误。

main.php<br/>
<iframe id='frm_main.php' src='test_automation.php?CMD=CheckSyntaxPHP&PHP_FILE=main.php'>main.php</iframe><br/><br/>
second.php<br/>
<iframe id='frm_second.php' src='test_automation.php?CMD=CheckSyntaxPHP&PHP_FILE=second.php'>second.php</iframe><br/><br/>

test_automation.php命令CMD=CheckSyntaxPHP只检查文件的扩展名和存在,并包含请求的php文件。

我使用相同的原理来检查所有javascript文件的语法 - 每个JS文件的IFrame。CMD=CheckSyntaxJS创建了一个包含两个javascript块的html文件:

javascript 的第一个块只定义了一个 javascript 错误处理程序,将所有错误发送到我的 web,这会将它们记录到数据库中。(它必须位于单独的块中,以便 JS 中的语法错误不会阻止错误处理程序调用。

javascript 的第二个块块包含从当前检查的 JS 文件加载的文本。

<html>
<head>
<script type='text/javascript'>
function MyOwn_OnError(msg, url, lineNo, columnNo, error)
{ // do your error handling here, show or log the error
  var sError="Error: "+error+" in "+url; // build your own error message
  sError=encodeURIComponent(sError);
  var oReq = new XMLHttpRequest();
  if (bShowToUser) // define the handlers showing success if necessary
    { oReq.addEventListener("load", MyOwn_OnError_TransferComplete);
      oReq.addEventListener("error", MyOwn_OnError_TransferFailed);
      oReq.addEventListener("abort", MyOwn_OnError_TransferCanceled);
    }
  oReq.open("GET", "https://www.yourwebpage.com/ErrorHandlerJS?ErrMsg="+sError);
  oReq.send();
// and show something about sending the error to the user in the html page if needed
}
window.onerror=MyOwn_OnError;
</script>
<script type='text/javascript'>
// and here is the content of your javascript file
</script>
</head>
<body>
</body>
</html>