根據PHP 7返回類型提示,以及爲什麼如果將類定義爲返回類型時不可能返回null,已經有很多問題了。像這樣:Correct way to handle PHP 7 return types。 答案通常說,它不是一個問題,就好像一個函數應該返回一個類,然後返回null可能是一個例外。 也許我錯過了某些東西,但我不明白爲什麼。例如,讓我們看到一個簡單的用戶類:PHP 7返回類型提示
class User
{
private $username; // mandatory
private $password; // mandatory
private $realName; // optional
private $address; // optional
public function getUsername() : string {
return $this->username;
}
public function setUsername(string $username) {
$this->username = $username;
}
public function getPassword() : string {
return $this->password;
}
public function setPassword(string $password) {
$this->password = $password;
}
public function getRealName() : string {
return $this->realName;
}
public function setRealName(string $realName = null) {
$this->realName = $realName;
}
public function getAddress() : Address {
return $this->address;
}
public function setAddress(Address $address = null) {
$this->address = $address;
}
}
在我們的應用程序是完全合法的,有一個用戶沒有實名和/或不帶地址。我甚至可以將realName和address字段設置爲null - 即使上述解決方案不是最優的。而在我們的個人資料頁面中,如果地址爲空(空),我想顯示提示。
但這只是一個例子。我們的應用程序有超過100個數據庫表和相應的PHP類,幾乎所有的都有可選字段。總是寫一個try catch塊,而不是簡單地檢查null來處理可選字段,這對我來說似乎有點不理想。
那麼對於上面的例子什麼是一個好的解決方案?
你可以初始化變量以清空默認值(像字符串爲''和地址對象爲空/無效/默認值。你也可以使用你的類從包裝器調用它們來捕獲異常if您不會返回null – Nadir
我不認爲getAddress()。getCity ===''比簡單地檢查getAddress()== null更好,除此之外,這個檢查可能會很複雜,例如,如果郵政編碼是可選的那麼一個新的開發人員可以編寫一個代碼:getAddress()。getZip()==='',他/她認爲地址丟失了,但是隻有郵政編碼丟失了 – Vmxes
在你的例子中,你期望調用代碼的行爲在'$ this-> realName'爲空時調用'getRealName()'時是否需要測試值並在它爲空時處理它?如果是這樣的話:你的類應該這樣做。對於大量的字符串操作來說,空字符串應該像空字符串一樣對待,您可能實際上應該將其默認爲空字符串,而不是空字符串。大多數情況可以像這樣解決。這就是說,我認爲PHP在執行這個過程中被認爲是不恰當的。 –