【问题标题】:Handling "Undefined Index" in PHP with SYmfony使用 SYmfony 处理 PHP 中的“未定义索引”
【发布时间】:2013-11-11 07:17:27
【问题描述】:

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

例子:

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

请问如何处理这个错误?

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

【问题讨论】:

  • 检查if(isset($test["323"]))怎么样?
  • 这是一个 PHP 问题,而不是 Symfony 问题:see here.
  • Undefined index (PHP)的可能重复
  • +1 表示问题,因为设置额外的代码测试变量非常烦人,例如。当使用?? 或类似的后备时。在我的情况下,使用 @ for suppressing notice 登录到 Symfony 记录器也不起作用。根据 PHP doc @ 不会禁止调用自定义错误处理程序。正如链接页面上的注释中所述,这取决于该自定义处理程序是否服从个别抑制。因此,它与 Symfony 的关系比与 PHP 的关系更大……最终这个问题也不是链接线程的重复。

标签: php exception symfony error-handling dry


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    两者:

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

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

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

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

    【讨论】:

    • @Dbugger 大多数时候,您应该知道数组中有什么。
    • 但如果我正在加载我的客户可以自定义的 yaml 或 INI 文件,它可能会破坏一些东西。仍然不是问题的重点
    • @Dbugger 在页面加载时,您不会通过循环加载ini文件吗?并为每个设置设置默认值,以防它们在 ini 文件中不存在?
    • 可能的解决方案,但可能不适用于所有情况
    【解决方案3】:

    一个选项是使用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() 周围。有问题的代码可以小到一行,也可以大到整个脚本。当然,临界区越大,错误处理程序就必须越“智能”。

    【讨论】:

    • 这看起来更像我想要的!但我想知道如何处理这个问题...
    • @Dbugger:嗯,我想这取决于应用程序逻辑。在这样的情况下,你希望发生什么?我的猜测是,您需要一些自定义故障转移 (plan-B) 程序来接管并解决问题。
    • 哦,你的意思是“my_error_handler”里面的东西相当于“catch”块?我认为这将是执行“投掷”的地方。你能否给我看一个例子,你喜欢什么错误处理?另外,当在 try-catch 块中时,这个 error_handler 是如何使用的?
    • 我认为我提供的链接有更好的例子,我可以在这里提供。对这些函数的工作原理以及可以传递哪些其他参数也有很好的解释。
    【解决方案4】:

    也许你想实现这个目标?

    $test = array();
    $test[]="323";
    
    echo $test[0];//323 
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        使用array_key_exists(),点赞

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

        【讨论】:

          猜你喜欢
          • 2014-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-11
          • 2013-01-26
          • 1970-01-01
          • 1970-01-01
          • 2014-08-11
          相关资源
          最近更新 更多