簡體   English   中英

PHP:是否有空合並運算符的反面?

[英]PHP: Is there opposite of null coalescing operator?

我經常遇到變量可以是objectnull

當我將數據放入數據庫時​​,我必須堅持這樣的事情:

// @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM