Php 为什么empty()抛出一个';未定义索引'-错误?

Php 为什么empty()抛出一个';未定义索引'-错误?,php,Php,我的代码如下。根据我对不同网站和php文档的理解,empty()是一种检查键是否存在的语言构造,就像isset()(只是在变量或键存在的情况下,它也会进行松散的“假”比较 37 $origin = 38 !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 39 !empty($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP

我的代码如下。根据我对不同网站和php文档的理解,
empty()
是一种检查键是否存在的语言构造,就像
isset()
(只是在变量或键存在的情况下,它也会进行松散的“假”比较

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部分括在括号中修复了它。当我发现确切的问题(关联性或else…)时,我将再次更新此答案

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

这个错误的原因是PHP中三元运算符的关联性——它是,而在大多数其他语言中它是从右向左的。这就是为什么嵌套三元运算符在PHP中读写都非常麻烦的原因。)

在这种特殊情况下,它特别意味着:如果设置了
HTTP\u REFERER
头,则还将检查
$\u SERVER['HTTP\u ORIGIN']
的值

要解决这个问题,您需要将条件用括号括起来,如果elseif else使用普通的old
,或者(对我来说最有意义)对代码进行一些抽象:

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

这个错误的原因是PHP中三元运算符的关联性——它是,而在大多数其他语言中它是从右向左的。这就是为什么嵌套三元组在PHP中读写都非常麻烦的原因。)

在这种特殊情况下,它特别意味着:如果设置了
HTTP\u REFERER
头,则还将检查
$\u SERVER['HTTP\u ORIGIN']
的值

要解决这个问题,您需要将条件用括号括起来,如果elseif else使用普通的old
,或者(对我来说最有意义)对代码进行一些抽象:

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


使用这样的嵌套三元操作应该是非法的。很难读取和调试。请在ternaries中添加一些括号,以便正确处理。当你不使用括号时,事情会变得很奇怪,很有趣。这是什么php版本?请提供一个最小但有效的代码示例供我们测试。谢谢。我会尽量提供一个最简单的例子,以及周四之前的php版本——如果没有找到真正的原因(可能是关联性),那么就在前面。只是提醒一下。现在,这对你来说可能很好,但是当你在几周/几个月甚至几年后回去,需要阅读/更新代码(或者更糟糕的是,其他人需要这样做),你会后悔的。文件中的行很便宜。您应该尝试使代码更具可读性。另外,如果你这样做了,这可能不是一个问题,使用嵌套的三元操作应该是非法的。很难读取和调试。请在ternaries中添加一些括号,以便正确处理。当你不使用括号时,事情会变得很奇怪,很有趣。这是什么php版本?请提供一个最小但有效的代码示例供我们测试。谢谢。我会尽量提供一个最简单的例子,以及周四之前的php版本——如果没有找到真正的原因(可能是关联性),那么就在前面。只是提醒一下。现在,这对你来说可能很好,但是当你在几周/几个月甚至几年后回去,需要阅读/更新代码(或者更糟糕的是,其他人需要这样做),你会后悔的。文件中的行很便宜。您应该尝试使代码更具可读性。另外,如果您这样做了,这可能不是一个问题。它是有效的,因为没有检查成功。显示操作代码中发生的情况。啊。当然当你以这种方式展示它时,它是如此明显…:-)我将else部分用括号括起来,而不是条件-请参阅我的更新。但你让我走上了正确的道路。非常感谢。还感谢您提供的替代方法。@Toastgeraet您需要按照您希望处理的顺序包装每个条件,例如
(false===true?true:(false===false?true:false))
请参见:示例。它有效,因为没有检查成功。显示操作代码中发生的情况。啊。当然当你以这种方式展示它时,它是如此明显…:-)我将else部分用括号括起来,而不是条件-请参阅我的更新。但你让我走上了正确的道路。非常感谢。还感谢您提供的替代方法。@Toastgeraet您需要按照希望处理的顺序包装每个条件,例如
(false==true?true:(false==false?true:false))
请参阅:以获取示例。