我想简化我的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 ?? ''
可以工作,但是某些数据功能是必需的/可取的。
答案 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'
,对于空字符串为假