[英]PHP: Is there opposite of null coalescing operator?
我經常遇到變量可以是object
或null
。
當我將數據放入數據庫時,我必須堅持這樣的事情:
// @var User|null $user
$data['id_user'] = $user!==null ? $user->getId() : null;
有沒有辦法縮短這個? 我知道??
,但這有點相反。
我正在使用 PHP 7.1。
從 PHP 8 開始,有nullsafe 運算符?->
。 有了它,你可以像這樣重構你的代碼:
// @var User|null $user
$data['id_user'] = $user?->getId();
在 PHP 8 之前,您可以利用自動 bool 轉換來利用以下事實: 在轉換為 bool 時, null 被認為是 false ,但其他對象不是(除了顯然從空標簽創建的 SimpleXML 對象也被認為是 false )。 因此,您可以將示例縮短為以下內容:
// @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();
在這種特殊情況下,我認為這個技巧(避免“不等於”)效果很好,但有時與直覺相反,代碼仍然更自然地可讀,無論如何只使用“不等於”。
如果您在用戶對象中定義了一個__toString()
類,並__toString()
返回 id,那么您可以使用 null 合並運算符:
class User
{
public function __toString()
{
return (string) $this->getId();
}
}
$data['id_user'] = $user ?? null;
這也不會產生任何警告。
但是,如果您有多個字段要執行此操作,這並沒有太大幫助。
我認為沒有一個運營商可以做到這一點。
最接近的是@
error-suppression 操作符:
$data['id_user'] = @$user->getId();
如果$user->getId()
出現錯誤,則錯誤消息將被抑制並且值為null
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.