5

我知道通过使用eval($code_to_check);我们可以检查这个值是否相等FALSE,如果是,我们可以停止脚本的执行。但是,我面临的问题是我无法定义一个函数,因为它被调用了两次......它被 eval() 检查处理以确保没有语法错误,然后再次处理该函数,但显示一个错误,指出它不能 REDECLARE 这个函数,因为它已经在 eval'd 函数中声明。我怎样才能做到这一点,以便我们不在 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();
}
4

4 回答 4

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);
}
于 2014-07-22T08:50:52.430 回答
1

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

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

于 2017-05-03T07:17:38.657 回答
0

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

eval — 将字符串计算为 PHP 代码

但是,PHP 文档本身说这eval是一个危险的结构:注意

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

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

我认为您需要的是一个工具,可以帮助您进行语法检查以检测违反定义的编码标准的情况。我使用 ESLint 检查 Javascript 代码中的违规行为。对于 PHP,我使用 PHPStorm 和 Sublime Text,我使用 PHP Lint 和 PHPCS。我建议您使用其中一种或这些工具的组合来实现您的目标,而不是进行评估。

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

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

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

-谢谢

于 2016-10-06T08:45:05.337 回答
0

我找到了一种在我的测试自动化中一次检查所有 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/>

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

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

javascript 的第一个块只定义了一个 javascript 错误处理程序,将所有错误发送到我的网站,这会将它们记录到数据库中。(它必须在一个单独的块中,以便 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>
于 2020-12-08T18:31:42.227 回答