处理未定义的索引崩溃


handle undefined index crashes ?

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

例如:

$arr=[];return$arr1;

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

我该怎么办?

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

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

我不能遍历所有的代码并用isset包装每一行。这是一项艰巨的工作。

感谢

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

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

对于刀片:

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

这两个例子的工作方式如下代码:

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

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

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

你说这不是代码问题,而是Laravel问题。。。。。代码问题,如果您试图访问不存在的数组元素,PHP会发出通知。。。。你可以选择压制该通知,或者(像拉拉威尔那样)以干净的方式报告;但这不是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自己的错误处理例程集成

演示