4

我正在使用 Symfony 2 构建一个应用程序,我想知道,当我尝试读取不存在的数组中的索引时如何处理错误?可悲的是,这种错误不会引发异常,所以我不能真正使用 try-catch 块。

例子:

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

请,想法如何处理这个错误?

更新:我已经看到了很多解决方案isset。这样做的问题是我必须在每次访问数组索引时都这样做。谁能给我一个更干燥的解决方案?

4

6 回答 6

13

两个都:

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

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

将允许您在尝试使用它之前检查是否定义了数组索引。这不是 Symfony 特有的错误。这是一个常见的 PHP 警告,每当您尝试访问不存在的数组元素时就会出现这种警告。

$val = isset($test["323"]) ? $test["323"] : null;
于 2013-10-31T10:28:16.833 回答
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()。有问题的代码可以小到一行,也可以大到整个脚本。当然,临界区越大,错误处理程序就必须越“智能”。

于 2013-10-31T11:07:15.990 回答
3

使用array_key_exists(),比如

if (array_key_exists('123', $test)) {
    echo "it exists";
}
于 2013-10-31T10:27:07.037 回答
0

你可以用 isset 捕捉到这个 bx: if(isset($test["323"])){ //The value fo this key is set. }

于 2013-10-31T10:29:10.753 回答
0

可能是你想实现这个?

$test = array();
$test[]="323";

echo $test[0];//323 
于 2013-10-31T10:34:27.400 回答
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 
}
于 2020-07-09T09:05:38.030 回答