我经常处于变量可以为object
或null
的情况下。
当我将数据放入数据库时,我必须坚持这样的东西:
// @var User|null $user
$data['id_user'] = $user!==null ? $user->getId() : null;
有什么办法可以缩短这个时间吗?我知道??
,但这有点相反。
我正在使用PHP 7.1。
答案 0 :(得分:0)
如果您在用户对象中定义一个__toString()
类,并返回ID,则可以使用null合并运算符:
class User
{
public function __toString()
{
return (string) $this->getId();
}
}
$data['id_user'] = $user ?? null;
这也不会生成任何警告。
但是,如果要使用多个字段,这样做并没有太大帮助。
答案 1 :(得分:0)
从PHP 8开始,有nullsafe operator ?->
。有了它,您可以像这样重构代码:
// @var User|null $user
$data['id_user'] = $user?->getId();
在PHP 8之前,您可以利用自动布尔转换来利用when converting to bool, null is considered false,但其他对象不是这样的事实(除了显然从空标记创建的SimpleXML对象也被认为是错误的)。因此,您可以将示例简化为以下内容:
// @var User|null $user
$data['id_user'] = $user ? $user->getId() : null;
但是,由于?的原因,它的可读性可能较低。可能对您使用bool的某些人有所暗示,或者可能使读者不得不考虑将null转换为bool的方式。您的原始代码更加明确,因此可能更具可读性。就个人而言,为了减轻大脑的负担,我喜欢尽可能避免使用“不等于”,而直接使用“等于”。因此,您可以将代码重构为:
// @var User|null $user
$data['id_user'] = $user === null ? null : $user->getId();
答案 2 :(得分:-1)
我认为没有运营商可以做到这一点。
最接近的是@
错误抑制运算符:
$data['id_user'] = @$user->getId();
如果$user->getId()
出错,则错误消息将被抑制,值为null
。