17

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のデフォルトは「弱い型ヒント」だと思いました。

4

2 に答える 2

27

PHP 7.1 ではnullable typesが追加されました。ここでは、型名の前に疑問符を付けて、戻り値の型がその型と null の両方を受け入れることを示します。

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

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

于 2016-02-03T18:02:30.850 に答える
0

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

于 2016-02-02T20:52:36.380 に答える