使用Symfony处理PHP中的“未定义索引”错误

5

我正在使用Symfony 2构建应用程序,并且想知道,当我尝试读取不存在的数组索引时,如何处理错误?不幸的是,这种错误不会抛出异常,所以我无法使用try-catch块。

示例:

$test = array();
$test["323"];       // Undefined index error!

请问,如何处理这些错误?

更新: 我看到很多解决方案都使用了isset。但问题是,我需要在每次访问数组索引时都进行检查,这样做不够DRY。有没有其他更好的解决方案?


检查一下 if(isset($test["323"])) 怎么样? - geomagas
这是一个PHP问题,而不是Symfony的问题:请参见此处 - halfer
可能是未定义的索引(PHP)的重复问题。 - halfer
对于编程人员来说,如果已经使用??或类似的回退选项,那么设置额外的代码测试变量是非常烦人的。在我的情况下,使用@来抑制通知记录到Symfony日志器中也没有起作用。根据PHP文档,@不会抑制调用自定义错误处理程序。如链接页面上的注释所述,这取决于该自定义处理程序是否遵守个别抑制。因此,这更与Symfony有关,而不是PHP...最终,这个问题也不是链接线程的重复。 - Thomas Urban
6个回答

14

两个人:

if(isset($test["323"])){
   //Good
}

if(array_key_exists('123', $test)){
   //Good
}

这个函数可以让你在使用数组元素之前检查它是否被定义。这不是Symfony特有的错误,而是PHP中常见的警告,当你试图访问一个不存在的数组元素时会出现。

$val = isset($test["323"]) ? $test["323"] : null;

@Dbugger 大多数情况下,您应该知道您的数组中包含什么。 - Wayne Whitty
但是如果我正在加载一个YAML或INI文件,而这个文件可以由我的客户自定义,那么它可能会破坏一些东西。但这仍然不是问题的重点。 - Enrique Moreno Tent
1
@Dbugger 在页面加载时,您不会通过循环加载ini文件吗?并为每个设置设置默认值,以防它们在ini文件中不存在? - Wayne Whitty
可能是一种解决方案,但并不适用于每种情况。 - Enrique Moreno Tent

8
一个选择是使用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()之间。相关的代码可能只有一行,也可能是整个脚本。当然,临界区越大,错误处理程序就需要越“智能”。

这看起来更像是我想要的!但我想知道如何处理这个问题... - Enrique Moreno Tent
@Dbugger:嗯,我想这取决于应用逻辑。在这种情况下,你希望发生什么?我的猜测是,你希望有一些自定义的故障转移(备用计划)程序接管并解决问题。 - geomagas
哦,你的意思是“my_error_handler”里面的内容相当于“catch”块?我以为那里是执行“throw”的地方。你能否给我展示一个例子,使用你喜欢的任何错误处理方式?另外,当它在try-catch块中时,这个error_handler会如何运作? - Enrique Moreno Tent
我认为我提供的链接有比我在这里提供的更好的例子。还有一个很好的解释,说明这些函数如何工作以及可以传递哪些其他参数。 - geomagas

3

使用array_key_exists()函数,例如:

if (array_key_exists('123', $test)) {
    echo "it exists";
}

0
也许你想要实现这个?
$test = array();
$test[]="323";

echo $test[0];//323 

0
你可以通过使用isset将其捕获: if(isset($test["323"])){ //该键的值已设置。 }

0

尝试/捕获未定义或多个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 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接