为什么empty()抛出一个未定义的索引' -Error?

时间:2018-01-30 14:47:04

标签: php

我的代码如下。根据我对不同网站和php文档的理解,empty()是一种语言结构,用于检查密钥是否存在,就像isset()一样(只是它还会松散' false'} - 变量或密钥存在时的比较......

37     $origin = 
38                !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] :
39                !empty($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] :
40                !empty($_SERVER['ORIGIN']) ? $_SERVER['ORIGIN'] :
41                "Unknown Origin";

错误:

  

未定义的索引:somePHPFile.php中的ORIGIN:40

更新 我通过将else部分包装在括号中来修复它。当我发现确切的问题(关联性或其他......)时,我会再次更新这个答案。

        $origin = 
            (!empty($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] :
            ((!empty($_SERVER['HTTP_ORIGIN'])) ? $_SERVER['HTTP_ORIGIN'] :
            (!empty($_SERVER['ORIGIN']) ? $_SERVER['ORIGIN'] :
            "Unbekannte Herkunft"));

1 个答案:

答案 0 :(得分:3)

这个错误的原因是PHP中三元运算符的关联性 - 它是left-to-right,而在大多数其他语言中它是从右到左。这就是为什么嵌套的三元组非常麻烦,只需要读取来编写PHP。 )

在这种特殊情况下,它尤其意味着以下内容:如果设置了HTTP_REFERER标头,则还会检查$_SERVER['HTTP_ORIGIN']的值。

要解决这个问题,你需要在括号中包装条件,使用普通的旧if-elseif-else组合,或者(对我来说最有意义)对你的代码做一些抽象:

$origin = 'Unknown Origin';
$headersToCheck = ['HTTP_REFERER', 'HTTP_ORIGIN', 'ORIGIN'];
foreach ($headersToCheck as $header) {
  if (!empty($_SERVER[$header]) {
    $origin = $_SERVER[$header];
    break;
  }
}