web-dev-qa-db-ja.com

戻り値の型宣言でNULLを返す

問題が発生したとき、PHP7で使用するためにコードベースをリファクタリングしていました。特に、スカラー型のヒントと戻り値の型のヒントを実装していました。

いくつかのプロパティを持つクラスがあり、そのうちの1つはIDです。このIDは必須ではありません(IDを設定せずにオブジェクトを作成できます)。このクラスの新しいオブジェクトを作成するときは、IDを設定せず、(別のマッパークラスによって)データベースに挿入されるとすぐにIDを取得します。

このマッパークラスは、オブジェクトがデータベースにすでに存在するかどうかを確認する必要があり、IDが設定されているかどうかを確認することでこれを行います。

_if(empty($exampleObject->getId())) {
    // Insert object
} else {
    // Update object
}
_

コードベース内のすべての関数に戻り値の型のヒントを適用していましたが、問題は、関数getId()[〜#〜] null [〜#〜を返すことができないことです。 ]intの戻り値の型を強制する場合。厳密な型指定が有効になっていない場合でも、TypeErrors:

致命的なエラー:キャッチされないTypeError:ExampleClass :: getId()の戻り値は整数型である必要があり、nullが返されます

このゲッターに戻り値の型のヒントを設定しないことを検討しましたが、問題はおそらく戻り値の型のヒントではなく、混合の戻り値の型を使用しているという事実に気付きました。混合戻り値の型を使用することは悪いことだとどこかで読んだことを覚えていますが、混合戻り値の型を使用せずにこれに取り組む方法がわかりません。私はできた:

  • ゲッターで例外をスローし、その例外をキャッチするようにマッパークラスでチェックを設計します。
  • TypeError例外をキャッチし、それを使用してIDが設定されていないことを示します。
  • Idプロパティをパブリックにして、issetを直接呼び出すことができるようにします。
  • 別のメソッドを追加するhasId() return isset($this->id)

率直に言って、これらのソリューションのどれも本当に好きではありません、そして私はより良いオプションがあるかどうか疑問に思いました。このような場合のベストプラクティスは何ですか?

また、厳密な型指定を有効にしている場合にのみTypeErrorが発生するのではないでしょうか。 PHP7はデフォルトで「弱いタイプのヒント」になっていると思いました。

16
Compizfox

PHP 7.1で追加された null許容型 、型名の前に疑問符を付けて、戻り値の型をその型とnullの両方を受け入れるものとしてマークします。

public function getId(): ?int {
    /* … */
}

まだPHP 7.0を使用している場合は、型宣言を省略してdocblockを使用することをお勧めします。

26
Andrea

nullを使用するということは、値型をnullにすることはできないため、オブジェクト指向のアプローチを使用することを意味します。したがって、整数型のクラスラッパーを使用すると便利な場合があります。たとえば、 SplInt SPLタイプから。

0
max