使用合并运算符和函数调用的最简单方法

时间:2019-05-23 12:10:52

标签: php

我想简化我的PHP代码,虽然我发现合并运算符非常有用,但我不知道从对象调用函数时是否/如何使用它。

例如,

$message = $error_msg ?? 'No error message';

有效,但是:

$message = $exception->getMessage() ?? 'No error message';

不是。我最终不得不诉诸:

$message = isset($exception) ? $exception->getMessage() : 'No error message';

有什么办法可以使第二行代码正常工作,还是第三个示例是唯一的方法?

事先致歉,因为不知道提出此类问题的适当术语。这就是为什么我找不到答案的原因。

编辑:我编写的代码只是一个示例;这是一个普遍的问题。例如,假设我有一个同时用于创建和编辑用户的模板。 User对象具有一个getName()函数,该函数返回其名称。

创建新用户时,“名称”输入应为空。编辑用户时,应在“名称”输入中填写用户名称。当然,$ user不是在前者中设置的,而是在后者中设置的。

拥有<input value="<?php $user->getName() ?? '' ?>">是完美的,但会引发错误。 <input value="<?php isset($user) ? $user->getName() : '' ?>">有用,但是我发现前者更具可读性,所以我想知道是否有办法使它起作用。

我知道$user->name ?? ''可以工作,但是某些数据功能是必需的/可取的。

1 个答案:

答案 0 :(得分:0)

那个问题?和?工作不如您预期;

请参阅示例:

<?php

$string = "";

var_dump($string ?? 'ups');  // output ""
var_dump($string ? $string : 'ups');   //output "ups"

对于需要与isset()一起使用三进制的常见情况,添加了空合并运算符(??)作为语法糖。如果它存在且不为NULL,则返回其第一个操作数;否则返回第一个操作数。否则返回第二个操作数。 manual

所以它意味着:

$string ?? 'ups'等于isset($string) && $string !== null,适用于空字符串

$string ? $string : 'ups'等于$string == true ? $string : 'ups',对于空字符串为假