如何在PHP脚本中查找未定义的变量

如何在PHP脚本中查找未定义的变量,php,unit-testing,Php,Unit Testing,假设我们在PHP中有以下函数: public function testSomething() { $name = perform_sql_query("SELECT name FROM table WHERE id = $entity_id;"); assert($name == "some_name"); } 查询在语法上是正确的,但由于$entity\u id未定义,查询将始终搜索“id=0”,这在语义上是不正确的 我希望这些函数在尝试使用未定义变量时自动失败。PHP中

假设我们在PHP中有以下函数:

public function testSomething()
{
    $name = perform_sql_query("SELECT name FROM table WHERE id = $entity_id;");
    assert($name == "some_name");
} 
查询在语法上是正确的,但由于$entity\u id未定义,查询将始终搜索“id=0”,这在语义上是不正确的

我希望这些函数在尝试使用未定义变量时自动失败。PHP中有这样的机制吗?或者可能有一些工具,可以用来分析PHP源代码来找到这样的情况

更新这些未定义的变量可以出现在项目中的任何地方,所以正确的决定是检查每个函数中的函数参数


UPDATE2设置错误处理程序有帮助。现在,只要使用未初始化的变量,就会抛出异常。

PHP在脚本错误中有几个严重级别。你可以用它来设置一个错误。这就是您如何设置PHP以报告任何可能导致错误的内容(如果您是第一次设置PHP,则可能会导致大量消息,但修复这些错误将使您的应用程序更加稳定):

如果启用该选项,则计算该字符串时会抛出一条错误消息


此外,它将评估为无效的SQL(它将是
id=
而不是
id=0
),因此您的执行SQL查询也应该报告这一点。

在访问变量之前使用函数。

我通常检查函数中的值是否为null。您可以使用isset(),如果它是空字符串,也可以使用以下内容:

public function testSomething()
{    
    if(!empty($entity_id)){
            $name = perform_sql_query("SELECT name FROM table WHERE id = $entity_id;");    
            assert($name == "some_name");
            return true;
    }
    return false;
}
我还将使用以下行设置错误报告:

error_reporting(E_ALL | E_STRICT);
  • 使用以下命令将错误报告设置为php应用程序中的E_ALL:

    错误报告(E_全部)

或者为php.ini或.htaccess中的错误报告变量设置适当的值。这允许您捕获所有错误,包括与未定义变量相关的错误

  • 在开发环境中设置php错误日志,并在开发阶段仔细检查

最后,对于上述代码,在“perform\u sql\u query”函数中包含所有常识性错误处理。您的PrPrimySql查询函数可能是MySQL查询函数的包装器,因此检查MySQL查询(和类似)函数生成的错误。

< P>一个要考虑的问题是,对于现场站点,您可能不希望用户看到错误和警告。某些web主机提供一个error.log,用于记录php错误。以下是实时站点的自定义错误处理程序:

function log_error($no,$msg,$file,$line)
{

    $errorMessage = "Error no $no: $msg in $file at line number $line";

    file_put_contents("errors_paypal.txt",$errorMessage."\n\n",FILE_APPEND);    
}

set_error_handler('log_error');

最棒的是,你可以格式化它并转储你想要的各种信息。

它可以设置,但仍然有一个空值-1问题不是如何修复错误,而是如何让PHP报告它。让PHP报告它更容易,但不安全是的,但问题是:“我如何找到错误”,不是“我如何修复错误”其他人可能会因为其他原因更改错误报告并破坏某些内容。如果验证程序正确,有什么可以破坏的?在生产站点上,必须将错误报告设置为On。你可以为live site关闭它,但随后会看到我的答案。其他人不应该触及错误报告级别。或者,如果他真的必须的话,把它恢复到原来的价值。不总是这样。正如公认的答案所说,有时您希望关闭错误报告在生产站点中很好地失败。不,如果您有自定义错误处理程序,则不需要关闭错误报告。无论当前错误报告级别如何,都将始终调用错误处理程序。正如手册中所说:“请记住,标准PHP错误处理程序是完全绕过的,这一点很重要。”您应该看看PHP中的错误处理程序:使用empty()检查未设置或空变量,它比isset()和=“谢谢你,我不知道。我想如果取消设置会出错:)干杯
function log_error($no,$msg,$file,$line)
{

    $errorMessage = "Error no $no: $msg in $file at line number $line";

    file_put_contents("errors_paypal.txt",$errorMessage."\n\n",FILE_APPEND);    
}

set_error_handler('log_error');