2016-02-19 77 views
2

比方说,我想检查几个不同的参数,然后回到默认值,有没有办法做到这一点,没有难看和详细的写作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

我曾经做过error_reporting(0);警告消失.. – rahul

+0

我使用error_reporting来检查其他问题,所以我不想关闭它。 –

+0

我也不想压制E_NOTICE,因为我想从根本上解决问题,如果可能的话,而不是只是将它的报告静音。 –

回答

1

忽略PHP警告和通知并不是一个好主意。
但只是为了实验,我可以建议你错误控制运算符@
PHP支持一个错误控制运算符:at符号(@)。当在PHP中添加表达式时,可能会忽略可能由该表达式生成的任何错误消息。

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

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

+0

我不知道@操作符可以在使用变量之前使用;这真的很有趣,可能是一个很好的解决方案.. –

+0

我发现这不利于数组的情况下 - 例如: '$ animals = array(); $ my_animal = @ $ animals ['dog']? $ animals ['dog']:'有些狗的名字';' 这仍然会给我一个未定义的索引警告 - 有什么方法可以绕过你知道的吗? 替代方案非常冗长,我真的不喜欢它,并且需要花费一个月的星期天才能将其加入我的代码中!: 'if(isset($ animals)&& isset($ animals [ 'dog'])){$ my_animal = $ animals ['dog']; }其他{$ my_animal ='一些狗的名字'; }' –

0

你可以链?:但你仍然需要suppress errors@

例如,下面将同样工作,你的JavaScript示例:

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

它的多个 “单回退” 相当于:

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

不过要小心,?:仅检查tr 012。有场景isset()和真谛do not agree。此外,PHP 5.3中引入了?:后备功能。

如果你只关心nullness并且有可用的PHP 7,它会引入一个null coalescing operator

+0

这是一个好点;例如,truthyness并不完全可以工作,因为它会拒绝明确提供的布尔值false值。我喜欢这种风格,因为它简单明了,所以这是一种耻辱,不会奏效! –