Php 如何避免';默认值';价值观

Php 如何避免';默认值';价值观,php,Php,比方说,我想检查几个不同的参数,然后返回到默认值,有没有一种方法可以避免对isset()进行难看而冗长的编写 例如,在JS中,我们可以做: var someVariable=otherVar | | |另一个var | | |‘此处回退’ PHP中的等效项类似于: $someVariable=(isset($otherVar)?$otherVar:$isset($anotherVar)?$anotherVar:'fallback here') 这显然是一个混乱和可怕的阅读 针对单个回退,存在许多

比方说,我想检查几个不同的参数,然后返回到默认值,有没有一种方法可以避免对
isset()
进行难看而冗长的编写

例如,在JS中,我们可以做:

var someVariable=otherVar | | |另一个var | | |‘此处回退’

PHP中的等效项类似于:

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

这显然是一个混乱和可怕的阅读

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

$someVariable=$otherVar?:'fallback here'

但这对我要求不止一张支票没有帮助

考虑到我只关心该值是否已设置或是否为真值-y(即,我很高兴1被接受为已使用的值,并且跳过0/false/null以及要使用的链中的下一个参数),避免未定义索引警告的最佳方法是什么


实际上,在大多数情况下,我都会在阵列上执行此操作,但不是所有情况,而且它们可能是不同的阵列。我可能想首先使用$\u POST,然后在另一个键下选中$\u GET,然后返回默认字符串。例如,忽略PHP警告和通知根本不是一个好主意
但就为了实验,我可以向您推荐错误控制操作符
@

PHP支持一个错误控制操作符:at符号(@)。在PHP中,在表达式前面加上前缀时,将忽略该表达式可能生成的任何错误消息

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

您可以链接
?:
,但您仍然需要使用
@

例如,以下内容的工作方式与JavaScript示例类似:

$foo = @$bar ?: @$baz ?: @$qux ?: "I give up";
这相当于多个“单一回退”:

但是要小心,
?:
只检查真实性。在某些情况下,
isset()
和truthyness。此外,
?:
在中引入了回退功能


如果您只关心空值,并且PHP7可用,那么它引入了一个。

这是不明确的,不推荐使用

$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

我曾经做过错误报告(0);为了让警告消失..我使用错误报告来检查其他问题,所以我不想关闭它。我也不想禁止E_通知,因为我想从根本上解决问题,如果可能的话,而不仅仅是静音它的报告。我不知道@运算符可以在使用变量之前使用;这真的很有趣,可能是一个很好的解决方案..我发现这对数组没有帮助-例如:
$anivers=array()$我的动物=@$动物[“狗”]$动物['dog']:'somedog name'这仍然会给我抛出一个未定义的索引警告-有什么方法可以绕过你所知道的吗?另一种选择是如此的冗长,我真的不喜欢它,而且它需要一个月的星期天才能将其更新到我的代码中<代码>如果(isset($animals)&&isset($animals['dog']){$my_animal=$animals['dog'];}其他{$my_animal='Some dog name';}
这是一个很好的观点;truthyness不会起作用,因为它会拒绝显式提供的布尔值false。我喜欢它的风格,因为它简单明了,所以很遗憾它不起作用!
($a ? $b : $c) ?: $d