重用函数结果的简写 if 语句

Posted

技术标签:

【中文标题】重用函数结果的简写 if 语句【英文标题】:Reuse function result in shorthand if statement 【发布时间】:2015-10-12 23:17:59 【问题描述】:

有没有办法在不声明变量来保存函数结果的情况下,使用在简写 if 语句中调用的函数的结果,例如:

!empty(getType($user)) ? <RESULT OF FUNCTION> : ''

而不是做:

!empty(getType($user)) ? getType($user) : ''

这有效地调用了该函数两次。

【问题讨论】:

getType 返回什么?它真的需要!empty,这很像那里的普通布尔测试吗?否则就去getType() ?: "" 甚至。 @mario 见:php.net/manual/en/function.gettype.php :) @Rizier123 我认为这只是一个例子。一个普通的 PHP gettype() 不会返回任何除了字符串/真实的结果。 @mario gotcha。是的,可能是。 @mario getType() 只是一个示例,但在我的代码中,该函数返回一个字符串。 【参考方案1】:

只需将函数的返回值分配给变量,例如

!empty($result = getType($user)) ? $result : ''
     //^^^^^^^^^^                  ^^^^^^^ See here

编辑:

由于gettype() 总是返回一个字符串,您可以执行以下操作,但是三元组没有意义,因为它总是返回一个字符串。

getType($user)?: ''

【讨论】:

【参考方案2】:

很丑,但是

php > echo (empty($foo = 0)) ? $foo : 'false';
0

由于在 PHP 中赋值操作的结果是被赋值的值,你得到 $foo 定义,然后可以在以后将它用于true 子句。

【讨论】:

以上是关于重用函数结果的简写 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

重用语句和结果集是不是会释放其先前使用的资源?还是我必须在重用之前明确关闭它们?

重用 LINQ 查询

是否可以在相同的选择中重用聚合函数结果?

Oracle with重用子查询

在 Doctrine DBAL 中重用 QueryBuilder

数据库查询优化技术