如何在PHP脚本中查找未定义的变量
假设我们在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中
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错误日志,并在开发阶段仔细检查
最后,对于上述代码,在“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');