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

j0pj023g  于 6个月前  发布在  PHP
关注(0)|答案(4)|浏览(77)

假设我想检查几个不同的参数,然后返回到默认值,有没有一种方法可以做到这一点,而不需要丑陋和冗长的isset()编写?
例如,在JS中,我们可以这样做:
var someVariable = otherVar || anotherVar || 'fallback here';
PHP中的等价物是这样的:
$someVariable = (isset($otherVar) ? $otherVar : (isset($anotherVar) ? $anotherVar : 'fallback here'));
这显然是一个混乱和可怕的阅读。
对于单个回退存在许多解决方案,即:
$someVariable = $otherVar ?: 'fallback here';
但这并不能帮助我在检查线上需要多个人。
考虑到我只对值是否为set或truth-y感兴趣(即我很高兴接受1作为使用值,跳过0/false/null并使用链中的下一个参数),避免未定义索引警告的最佳方法是什么?
实际上,我会在 * 大多数 * 情况下对数组执行此操作,但不是所有情况,而且它们可能是不同的数组。例如,我可能希望首先使用$_POST,然后在不同的键下检查$_GET,然后回退到默认字符串。

g9icjywg

g9icjywg1#

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

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

字符串
http://php.net/manual/en/language.operators.errorcontrol.php

dy2hfwbg

dy2hfwbg2#

您可以链接?:,但仍需要将suppress errors@链接。
例如,以下代码的工作方式与您的JavaScript示例类似:

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

字符串
这相当于多个“单一回退”:

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


不过要小心,?:只检查 truthyness。在某些情况下,isset()和truthyness do not agree。此外,PHP 5.3中引入了?:回退功能。
如果你只关心空值并且PHP 7可用,它引入了null coalescing operator

n3schb8v

n3schb8v3#

这是模糊的,它是不可取的...

$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

uoifb46i

uoifb46i4#

如果你想替换isset和三进制,你可以使用null合并运算符??,也就是added in PHP 7.0

$null = null;
$array = [];

$value = $null ?? null ?? $array[0] ?? $nonexistent ?? 'default';

echo $value; // Output: "default"

字符串
isset一样,它只检查值是否为null(或者变量/键不存在),所以可能会返回假值:

$blank = '';
$zero = 0;
$false = false;

echo 'Blank: ' . ($blank ?? 'nah'); // Output: "Blank: "
echo 'Zero: ' . ($zero ?? 'nah'); // Output: "Zero: 0"
echo 'False: ' . ($false ?? 'nah'); // Output: "False: "


如果你确定变量/键存在,但不想得到一个假值,你可以连续多次使用?:

echo ('' ?: 0 ?: false ?: [] ?: 'default'); // Output: "default"

相关问题