仅使用带有两个参数的PHP三元运算符


9

我最近正在查看我的一些代码,并注意到由于缺乏思想,我留下了如下结构:

$guid = empty($subscription->guid) ?  : $subscription->guid;

现在,这没有做应该做的事情,而且是错误的,但是由于该属性始终处于设置状态,因此它可以正常工作,并且由于以下更改,自5.3以来没有语法错误:

从PHP 5.3开始,可以省略三元运算符的中间部分。如果expr1的计算结果为TRUE,则表达式expr1?:expr3返回expr1,否则返回expr3。

我当时还没有意识到这一变化,现在我很好奇是否应该使用它。这是ruby之类的语言所无法比拟的,您可以在其中a = b || c获取b或不获取c“真实”布尔值。但是,他们为三元运算符选择的语法对我来说似乎有点不直观。我应该在生产代码中使用它吗?当我偶然看到它的时候,它肯定让我感到震惊。


您应该为此Varsolp
Ankur Kumar Singh

Answers:


7

没有第二个参数的三元条件运算符有点新颖,但是它与其他Algol派生语言(如C#和Perl)以及如Ruby(和JavaScript)中的运算符相似,与空值运算符1相似。||

乍一看看起来很奇怪,但是还不算太远(特别是因为有其他语言的类似运算符的先例),并且可以节省很多击键次数。而且,如果命名空间定界符(\)发生了什么迹象,那么PHP社区最终将采用奇怪的语法。

但是,PHP应用程序往往会面临的主要问题之一是,有时从发行新版本的PHP到主机开始支持它之间的时间间隔非常长。这就导致了一些问题,您需要与旧版本的PHP向后兼容,而放弃使用此类便利性更改。

如果您不必担心,并且您的团队同意使用它(或者如果您是一个单独的开发人员,如果您愿意的话),则一定要这样做。像命名空间定界符一样,我真的认为这实际上取决于何时,而不是是否会在将来的所有PHP项目中接受。


注意1:但不完全相同,给定null运算符只能对非null值(而不是像PHP这样的真值)进行测试,并且该?:语法不会抑制注释中提到的未定义的通知。


此刻,我的“团队”完全由我组成。托管并不是一个问题,因为我们通常托管98%的网站,而我们托管的网站是5.3.6。我意识到功能本身并不罕见,只是它的语法是我问题的根源。还有一个问题是,如果没有更多语法(@隐藏有关未定义事物的通知),它就不会像空值运算符一样起作用。
马修·沙利

3
@MatthewScharley如果表示命名空间定界符(\)混乱,则怪异的语法不会成为PHP广泛采用的障碍。它实际上取决于您何时开始使用它,而不是是否开始使用它。

3

对我来说,这似乎是代码中的错误。看起来很不对劲,总的来说,我为了避免几次击键而避免使用看起来像是您犯了错误的语法。当您(或其他人)稍后返回阅读代码时,我认为那条线会绊倒您,并导致您不得不花时间解析其工作,这实际上是一个简单的操作。


给出的例子是错误的。按预期正确使用该功能$foo = @$bar ?: 'baz'等效于$foo = (@$bar ? $bar : 'baz')。我确实同意你的意见。
马修·沙利

1

好吧,PHP具有布尔类型,并且||运算符返回一个布尔值,因此在PHP中,结果$a || $b是布尔值,这与之一致,&&因为&&返回一个或另一个几乎没有意义,而返回true/ 则有意义false。让所有布尔运算符返回布尔值听起来也很合逻辑。

另外,这不是PHP的发明,而是C的继承,C是许多“经典” PHP的设计元素所来自的。引用C99标准的§6.5.14:

|| 如果运算符的两个操作数都不等于0,则运算符应产生1;否则,运算符应产生1。否则,结果为0。结果的类型为int。

而且,好了,您应该使用?:还是不能以一般形式回答,但是请记住:语言的最佳方法是使用它提供的构造并使用它建议的范例。编写Java代码(如C代码)或其他方法几乎没有道理;-)


0

我认为这是一个非常有用的运算符,由于语言标准明确定义了它,因此绝对应该使用它。

请注意,它在Grooy中被正式称为Elvis Operator(为什么?仔细看看吧!),并被提议在Java 7中引入。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.