处理未定义的索引崩溃?

时间:2016-05-04 15:09:03

标签: php laravel laravel-5

最近我开始使用laravel。但我想知道为什么它因为未定义的索引而崩溃并抛出异常。

例如:

$ ARR = []; 返回$ arr 1;

这导致应用程序崩溃并返回代码500.这一点都不好。我不需要它崩溃,它应该返回null。

我怎么能处理这个?

其他建议用isset包装每一行,例如:

if(isset($arr[1]))
   return $arr[1]

我无法浏览所有代码并使用isset包装每一行。这是一项艰苦的工作。

由于

2 个答案:

答案 0 :(得分:5)

如果您害怕冗余,可以使用快捷方式:

echo $arr[1] ?? ''; // works in `PHP 7` only

对于Blade:

{{ $arr[1] or '' }}

这两个示例的工作原理如下:

if (isset($arr[1])) {
    echo $arr[1];
} else {
    echo '';
}

如果您仍在使用PHP 5,则可以使用三元运算符:

echo isset($arr[1]) ? $arr[1] : '';

答案 1 :(得分:2)

你说这不是代码问题,而是Laravel问题..... 代码问题,如果你试图访问一个问题,PHP会发出通知不存在的数组元素....您可以选择禁止该通知,或者(如Laravel所做的那样)以干净的方式报告它;但它不是PHP问题,也不是Laravel问题;这是对草率编码的回应。如果它在Laravel之外没有问题,那就是因为你压制通知,而不是因为它不是问题。

如果你想要在数组中访问未定义的索引时想要返回null,那么我建议创建一个自定义错误处理程序来捕获它。

function myErrorHandler($errno, $errstr, $errfile, $errline) {
    if ($errno == E_NOTICE && strpos($errstr, 'Undefined offset') === 0) {
        return null;
    }
    return false;
}

$old_error_handler = set_error_handler("myErrorHandler");


$arr=[];

var_dump($arr[1]);

当然,您必须将该逻辑与Laravel自己的错误处理例程

集成

Demo