wake-up-neo.net

Rückgabe von NULL mit Rückgabetypdeklarationen

Ich habe eine Codebasis für die Verwendung mit PHP7 überarbeitet und dabei insbesondere skalare Typhinweise und Rückgabetyphinweise implementiert, als ich auf ein Problem gestoßen bin.

Ich habe eine Klasse mit einigen Eigenschaften, von denen eine eine ID ist. Diese ID ist nicht obligatorisch (Sie können ein Objekt erstellen, ohne die ID festzulegen). Wenn Sie ein neues Objekt dieser Klasse erstellen, setzen Sie die ID nicht und sie erhält eine ID, sobald sie in die Datenbank eingefügt wird (durch eine separate Mapper-Klasse).

Diese Mapper-Klasse muss überprüfen, ob das Objekt bereits in der Datenbank vorhanden ist. Dazu muss überprüft werden, ob die ID festgelegt ist:

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

Ich habe Rückgabetyphinweise auf jede Funktion in meiner Codebasis angewendet, und das Problem ist, dass die Funktion getId() nichtNULLzurückgeben kann, wenn ich einen int Rückgabetyp erzwinge. Es TypeErrors, auch ohne aktivierte strikte Eingabe:

Schwerwiegender Fehler : Uncaught TypeError: Rückgabewert von ExampleClass :: getId () muss vom Typ integer sein, null wird zurückgegeben

Ich habe überlegt, keinen Rückgabetyp-Hinweis für diesen Getter festzulegen, aber dann wurde mir klar, dass das Problem wahrscheinlich nicht der Rückgabetyp-Hinweis ist, sondern die Tatsache, dass ich gemischte Rückgabetypen verwende. Ich erinnere mich, dass ich irgendwo gelesen habe, dass die Verwendung gemischter Rückgabetypen eine schlechte Sache ist, aber ich bin nicht sicher, wie ich das angehen soll, ohne gemischte Rückgabetypen zu verwenden. Ich könnte:

  • Lösen Sie eine Ausnahme im Getter aus, und entwerfen Sie die Prüfung in der Mapper-Klasse so, dass diese Ausnahme abgefangen wird.
  • Fangen Sie die TypeError-Ausnahme ab und geben Sie damit an, dass die ID nicht festgelegt ist.
  • Machen Sie die id-Eigenschaft öffentlich, damit ich isset direkt aufrufen kann.
  • Eine andere Methode hinzufügen hasId() return isset($this->id)

Ehrlich gesagt, mag keine dieser Lösungen wirklich und ich habe mich gefragt, ob es eine bessere Option gibt. Was ist die beste Vorgehensweise für solche Fälle?

Sollte ich nicht auch nur einen TypeError erhalten, wenn die strikte Eingabe aktiviert ist? Ich dachte, PHP7 hat standardmäßig "schwache Tippfehler".

15
Compizfox

PHP 7.1 fügte nullfähige Typen hinzu, wobei Sie dem Typnamen ein Fragezeichen voranstellen, um den Rückgabetyp so zu kennzeichnen, dass er sowohl diesen Typ als auch null akzeptiert:

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

Wenn Sie noch mit PHP 7.0 arbeiten, empfehle ich, die Typdeklaration wegzulassen und einen docblock zu verwenden.

24
Andrea

null zu verwenden bedeutet, objektorientierte Ansätze zu verwenden, da Werttypen nicht null sein können. Daher kann es nützlich sein, einen Klassenwrapper um einen Integer-Typ zu verwenden. Zum Beispiel SplInt von SPL-Typen.

0
max