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

时间:2009-07-22 10:09:20

标签: php unit-testing

假设我们在PHP中有以下功能:

public function testSomething()
{
    $name = perform_sql_query("SELECT name FROM table WHERE id = $entity_id;");
    assert($name == "some_name");
} 

查询在语法上是正确的,但由于$ entity_id未定义 - 查询将始终搜索'id = 0',这在语义上是不正确的。

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

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

UPDATE2 设置错误处理程序有帮助。现在,无论何时使用未初始化的变量,都会抛出异常。

6 个答案:

答案 0 :(得分:6)

PHP在脚本错误中有多个严重性级别。您可以使用函数error_reporting()php.ini-directive with the same name设置您希望它考虑的错误。这就是你如何设置PHP来报告任何可能导致错误的(这可能会导致相当多的消息,如果你是第一次设置它,但修复这些错误会给你一个更稳定的应用程序):

# In your php script:
error_reporting(E_ALL | E_STRICT);

# Or in your php.ini:
error_reporting = E_ALL | E_STRICT

答案 1 :(得分:2)

如果你打开all warning and notices,评估该字符串会给你一个错误信息。

此外,它将评估为无效的SQL(它将id=而不是id=0),因此您的perform_sql_query也应该报告。

答案 2 :(得分:2)

我通常检查我的函数中的值是否为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);

答案 3 :(得分:2)

需要考虑的一个问题是,对于实际网站,您可能不希望用户看到错误和警告。一些web-host提供了一个记录php错误的error.log。这是实时网站的自定义错误处理程序:

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');

关于这一点的好处是你可以格式化它并转储你想要的各种信息。

答案 4 :(得分:1)

  • 使用以下命令在您的php应用中将错误报告设置为E_ALL:

    error_reporting(E_ALL);

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

  • 在开发环境中设置php error_log,并在开发阶段仔细检查。

最后,对于上面提到的代码,请在“perform_sql_query”函数中包含所有常识错误处理。你的perform_sql_query函数可能是mysql_query函数的包装器,所以检查mysql_query(和类似的)函数生成的错误。

答案 5 :(得分:-1)

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