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に設定することもできます。私のプロフィールページでは、アドレスがnull(空)の場合、ヒントを表示したいと思います。
しかし、これは1つの例にすぎません。私たちのアプリケーションには100以上のデータベーステーブルと対応するPHPクラスがあり、ほとんどすべてにオプションフィールドがあります。オプションのフィールドを処理するためにnullをチェックするのではなく、常にtry catchブロックを書くことは、私にとっては最適ではないようです。
上記の例の良い解決策は何ですか?
変数を空のデフォルト値に初期化するだけで済みます(空白/無効/デフォルト値を持つアドレスオブジェクトの文字列やアドレスなど)。例外をキャッチするラッパーから呼び出すクラスを使用することもできます – Nadir
getAddress()。getCity === ''は単純にgetAddress()== nullをチェックするよりも優れています。この他にもチェックが複雑になることがあります。例えば、郵便番号がオプションの場合新しい開発者は、getAddress()。getZip()=== ''というコードを書くことができます。アドレスが不足していると思っていますが、郵便番号だけが見つかりません。 – Vmxes
あなたの例では、 '$ this-> realName'がnullのときに' getRealName() 'を呼び出すときの動作ですか?それがnullの場合は値をテストして処理する必要がありますか?そうなら、あなたのクラスはそうしているはずです。ヌル文字列は、多くの文字列操作のために空文字列のように扱われますが、実際にはヌル文字列ではなく空文字列にデフォルト設定しなければなりません。ほとんどの状況はこのように解決できます。それは、私はPHPがこれを強制することで不適切に説得されていると思います。 –