我正在使用Symfony 2构建应用程序,并且想知道,当我尝试读取不存在的数组索引时,如何处理错误?不幸的是,这种错误不会抛出异常,所以我无法使用try-catch块。
示例:
$test = array();
$test["323"]; // Undefined index error!
请问,如何处理这些错误?
更新: 我看到很多解决方案都使用了isset
。但问题是,我需要在每次访问数组索引时都进行检查,这样做不够DRY。有没有其他更好的解决方案?
我正在使用Symfony 2构建应用程序,并且想知道,当我尝试读取不存在的数组索引时,如何处理错误?不幸的是,这种错误不会抛出异常,所以我无法使用try-catch块。
示例:
$test = array();
$test["323"]; // Undefined index error!
请问,如何处理这些错误?
更新: 我看到很多解决方案都使用了isset
。但问题是,我需要在每次访问数组索引时都进行检查,这样做不够DRY。有没有其他更好的解决方案?
两个人:
if(isset($test["323"])){
//Good
}
和
if(array_key_exists('123', $test)){
//Good
}
这个函数可以让你在使用数组元素之前检查它是否被定义。这不是Symfony特有的错误,而是PHP中常见的警告,当你试图访问一个不存在的数组元素时会出现。
$val = isset($test["323"]) ? $test["323"] : null;
set_error_handler()
函数来模拟异常。以下是一个示例用法,不过我相信你可以根据你的具体情况进行调整:function my_error_handler($errno,$errstr)
{
/* handle the issue */
return true; // if you want to bypass php's default handler
}
$test = array();
set_error_handler('my_error_handler');
$use_it=$test["323"]; // Undefined index error!
restore_error_handler();
set_error_handler()
和restore_error_handler()
之间。相关的代码可能只有一行,也可能是整个脚本。当然,临界区越大,错误处理程序就需要越“智能”。使用array_key_exists()函数,例如:
if (array_key_exists('123', $test)) {
echo "it exists";
}
$test = array();
$test[]="323";
echo $test[0];//323
if(isset($test["323"])){
//该键的值已设置。
}
尝试/捕获未定义或多个PHP错误的简单方法。
try{
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext){
if (0 === error_reporting()) { return false; }
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
$data = $json['name']; ---> Undefined Index name
}catch(Exception $e){
//Perform Furthur action
}
if(isset($test["323"]))
怎么样? - geomagas??
或类似的回退选项,那么设置额外的代码测试变量是非常烦人的。在我的情况下,使用@来抑制通知记录到Symfony日志器中也没有起作用。根据PHP文档,@不会抑制调用自定义错误处理程序。如链接页面上的注释所述,这取决于该自定义处理程序是否遵守个别抑制。因此,这更与Symfony有关,而不是PHP...最终,这个问题也不是链接线程的重复。 - Thomas Urban