假设我想检查几个不同的参数,然后回到默认值,有没有办法在没有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,然后回退到默认字符串,例如。
答案 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