【发布时间】:2012-07-20 07:02:01
【问题描述】:
我经常发现自己需要使用以下逻辑模式编写代码:
$foo = isset($bar) ? $bar : $baz;
我知道?: 语法:
$foo = $bar ?: $baz;
...从表面上看,这似乎是我正在寻找的东西;但是,当未设置 $bar 时,它会引发未定义的通知索引。它还使用与empty() 相同的逻辑,这意味着像FALSE、0、"0" 等“空”值不会通过。因此,它并不真正等同。
当$bar 未设置时,是否有更短的方法来编写代码而不发出通知?
编辑:
为了更清楚一点为什么我正在寻找一种快捷语法,这里有一个更好的例子:
$name = isset($employee->getName())
? $employee->getName()
: '<unknown>';
在这种情况下,$employee 可能是来自第 3 方库的对象,它的 name 可能是 NULL 可能是一个有效的场景。我想将变量 $name 设置为返回的名称(如果有的话),但如果没有的话,一些合理的默认值。
如果方法调用比 getter 更复杂,那么示例会变得更加冗长,因为我们必须缓存结果:
$bar = $some->reallyExpensiveOperation();
$foo = isset($bar) ? $bar : $baz;
【问题讨论】:
-
想一想:在一个表达式中,您想检查是否存在避免通知(
isset()这样做),如果已设置,则设置为第一个变量,否则设置为第二个?你有两个选择:第一个是你提出的,第二个是让通知静音。 -
你可以禁止警告:
$foo = @$bar ?: $baz;... 但我不会那样做。 -
你的生活一定很忙,无法在这几秒钟内输入
isset等。 -
在编写此类代码时可能会节省一些字符,但在调试时,它很快就会变成浪费时间的噩梦。我完全不鼓励任何使用这种神秘代码的人。但这是你的代码,做任何你想做的事......
-
@EdHeal:这个论点永远不会赢。大多数现代编程语言中实现的大量内容是语法糖和快捷方式。哎呀,三元运算符本身就是这样。
标签: php ternary-operator