如何避免“默认”值链的未定义索引警告?

时间:2016-02-19 17:43:37

标签: php

假设我想检查几个不同的参数,然后回到默认值,有没有办法在没有isset()的丑陋和冗长的写作的情况下做到这一点?

例如在JS中我们可以这样做:

var someVariable = otherVar || anotherVar || 'fallback here';

PHP中的等价物将是:

$someVariable = (isset($otherVar) ? $otherVar : (isset($anotherVar) ? $anotherVar : 'fallback here'));

这显然是一团糟,读起来很可怕。

对于单个回退存在许多解决方案,即:

$someVariable = $otherVar ?: 'fallback here';

但这并不能帮助我在检查中要求不止一个。

鉴于我只对该值是否设置或者是真实y感兴趣(即我很高兴1被接受作为使用的值,并且0 / false / null被跳过并且为下一个要使用的链中的参数),避免未定义索引警告的最佳方法是什么?

实际上,我会在大多数的情况下在数组上执行此操作,但不是全部,并且可能它们将是不同的数组。我可能想要使用$ _POST作为第一个,然后在另一个键下检查$ _GET,然后回退到默认字符串,例如。

3 个答案:

答案 0 :(得分:1)

忽略PHP警告和通知根本不是一个好主意。
但只是为了实验,我可以建议您使用错误控制操作符@
PHP支持一个错误控制操作符:at符号(@)。当在PHP中添加表达式之前,将忽略该表达式可能生成的任何错误消息。

$someVariable = @$otherVar ? @$var : 'fallback here';
echo $someVariable;
// output: fallback here

http://php.net/manual/en/language.operators.errorcontrol.php

答案 1 :(得分:0)

您可以链接?:,但仍然需要@$foo = @$bar ?: @$baz ?: @$qux ?: "I give up";

例如,以下内容与您的JavaScript示例类似:

$foo = (@$bar ?: (@$baz ?: (@$qux ?: "I give up")));

这相当于多个“单一后备”:

?:

但请注意,isset()仅检查 truthyness 。有些情况下?:和truthyness suppress errors。此外,do not agree中引入了<xs:complexType name="GetApplicationRequest"> <xs:choice> <xs:sequence> <xs:element ref="name"/> <xs:element ref="dob"/> </xs:sequence> <xs:element ref="license_id"/> </xs:choice> </xs:complexType> 后备功能。

如果您只关心null并且可以使用PHP 7,那么它引入了PHP 5.3

答案 2 :(得分:0)

这是模棱两可的,已弃用...

$something = $a ? $b : $c ?: $d;

因此,您有两种分组选择:

$something = $a ? $b : ($c ?: $d); // version 1
$something = ($a ? $b : $c) ?: $d; // version 2

哪个是正确的?让我们测试一下...

$posibilities = [TRUE, FALSE, NULL, [], new stdClass()];
$v1_is_correct = TRUE;
$v2_is_correct = TRUE;

foreach ($posibilities as $a) {
  foreach ($posibilities as $b) {
    foreach ($posibilities as $c) {
      foreach ($posibilities as $d) {

        $original = (int)($a ? $b : $c ?: $d);
        $v1 = (int)($a ? $b : ($c ?: $d));
        $v2 = (int)(($a ? $b : $c) ?: $d);

        $v1_is_correct = $v1_is_correct && ($original === $v1);
        $v2_is_correct = $v2_is_correct && ($original === $v2);

        print "ORIG: $original - V1: $v1 - V2: $v2 \n";
      }
    }
  }
}

print "\n";
$v1_is_correct ? print "V1 is correct \n" : NULL;
$v2_is_correct ? print "V2 is correct \n" : NULL;

结果: V2 是正确的。

$a ? $b : $c ?: $d 

相当于...

($a ? $b : $c) ?: $d
相关问题