PHP7 で使用するコードベースをリファクタリングしていて、特にスカラー型ヒントと戻り型ヒントを実装していたときに、問題が発生しました。
いくつかのプロパティを持つクラスがあり、そのうちの 1 つが ID です。この ID は必須ではありません (ID を設定せずにオブジェクトを作成できます)。このクラスの新しいオブジェクトを作成するときは、ID を設定しません。(別のマッパー クラスによって) データベースに挿入されるとすぐに ID を取得します。
このマッパー クラスは、オブジェクトがデータベースに既に存在するかどうかを確認する必要があり、id が設定されているかどうかを確認することでこれを行います。
if(empty($exampleObject->getId())) {
// Insert object
} else {
// Update object
}
コードベースのすべての関数に戻り値のヒントを適用していましたが、 intの戻り値の型を強制すると、関数がNULLgetId()
を返せないという問題がありました。厳密な型指定を有効にしなくても、TypeErrors が発生します。
致命的なエラー: キャッチされていない TypeError: ExampleClass::getId() の戻り値は整数型である必要があり、null が返されます
このゲッターに戻り値のヒントを設定しないことを検討しましたが、問題はおそらく戻り値のヒントではなく、混合した戻り値の型を使用しているという事実に気付きました。戻り値の型を混在させることは悪いことだとどこかで読んだことを覚えていますが、戻り値の型を混在させずにこれに取り組む方法がわかりません。私はできた:
- ゲッターで例外をスローし、その例外をキャッチするようにマッパー クラスでチェックを設計します。
- TypeError 例外をキャッチし、それを使用して ID が設定されていないことを示します。
- id プロパティを public にして、 issetを直接呼び出せるようにします。
- 別のメソッドを追加
hasId() return isset($this->id)
率直に言って、これらの解決策はどれもあまり好きではなく、より良い選択肢があるかどうか疑問に思っていました. このような場合のベストプラクティスは何ですか?
また、厳密な入力が有効になっている場合にのみ TypeError を取得するべきではありませんか? PHP7のデフォルトは「弱い型ヒント」だと思いました。