PHP 7.4 erlaubt Ausnahmen von __toString()
Einführung
Derzeit verboten von __toString() löst eine Ausnahme aus und führt zu einem Fataler Fehler. Dies macht das Aufrufen von beliebigem Code gefährlich und macht es zu einer problematischen Allzweck-API. Dieser RFC zielt darauf ab, diese Einschränkung aufzuheben.
Der Grund für das aktuelle Verhalten ist, dass String-Konvertierungen an vielen Stellen in der Engine und der Standardbibliothek durchgeführt werden und nicht überall darauf vorbereitet ist, Ausnahmen „richtig“, d. h. so früh wie möglich, zu behandeln.
Aus technischer Sicht ist diese Einschränkung letztlich ungültig, da Ausnahmen bei der String-Konvertierung immer noch durch Fehlerhandler ausgelöst werden können, die behebbare Fehler in Ausnahmen umwandeln:
set_error_handler(function() { throw new Exception(); }); try { (string) new stdClass; } catch (Exception $e) { echo "(string) threw an exception...\n"; }
Tatsächlich nutzt Symfony diese Schwachstelle aus um die aktuellen Beschränkungen zu umgehen. Leider beruht dies auf dem Parameter $errcontext, der in PHP 8 verschwunden ist.
Bis wir jedoch eine vollständige Überprüfung der String-Konvertierungen in dieser Codebasis durchführen, gab es in früheren Beiträgen zu diesem Thema keine Diskussion über eine Lockerung dieses Parameters Beschränkung. Dies wurde in einer beigefügten Implementierungsanfrage durchgeführt.
Es wird empfohlen, dass
das Auslösen von Ausnahmen von __toString() zulässt und es sich wie gewohnt verhält. Schwerwiegende Fehler werden nicht mehr ausgelöst.
Darüber hinaus wurden die behebbaren schwerwiegenden Fehler „Kann nicht in einen String konvertiert werden“ und „__toString() muss einen String-Wert zurückgeben“ in korrekte Fehlerausnahmen konvertiert, im Einklang mit der in PHP 7 festgelegten Fehlerrichtlinie.
Erweiterungsrichtlinien
Erweiterungsautoren, die Ausnahmen von String-Konvertierungen ordnungsgemäß behandeln möchten, sollten die folgenden Richtlinien berücksichtigen:
● Wenn zval_get_string( ), Convert_to_string () und Freunde generieren eine Ausnahme, sie generieren dennoch eine Zeichenfolge. Diese Zeichenfolge ist garantiert temporär. Das bedeutet, dass es nicht nötig ist, es freizugeben, es aber möglich ist. Im Kontext können Sie die bequemere Option wählen.
● Das Ergebnis der String-Konvertierung ist ein leerer String, wenn die Konvertierung vom Objekt in einen String fehlschlägt, oder ein leerer String, wenn das Array in einen String konvertiert wird und der Fehlerhandler die Ergebnisbenachrichtigung zu einer Ausnahme auslöst . „Array“. (Das Verhalten ist das gleiche wie zuvor.)
● Normalerweise reicht es aus, mit der üblichen if (EG(Exception))-Prüfung zu prüfen, ob eine Ausnahme ausgelöst wurde:
zend_string *str = zval_get_string(val); if (EG(exception)) { // Possibly free other resources here. return; }
außer Zusätzlich werden einige Hilfs-APIs bereitgestellt, die Konvertierungen als fehleranfällige Vorgänge modellieren:
// Like zval_get_string() but returns NULL on conversion failure. zend_string *str = zval_try_get_string(val); if (!str) { // Possibly free other resources here. return; } // Main code. zend_string_release(str); // Like zval_get_tmp_string() but returns NULL on conversion failure. zend_string *tmp, *str = zval_try_get_tmp_string(val, &tmp); if (!str) { // Possibly free other resources here. return; } // Main code. zend_tmp_string_release(tmp); // Like convert_to_string() but returns a boolean indicating conversion success/failure. if (!try_convert_to_string(val)) { // Possibly free other resources here. return; } // Main code.
Wenn die Konvertierung fehlschlägt, ändert try_convert_to_string() den ursprünglichen Wert nicht. Daher ist die Verwendung sicherer als die Verwendung von „convert_to_string()“ und der Ausnahmeprüfung.
Während Sie sicherlich auf der sicheren Seite sind, wenn Sie jede String-Konvertierung überprüfen, führt das Ignorieren dieser Überprüfungen oft nur zu ein paar unnötigen Berechnungen und möglicherweise überflüssigen Warnungen. Das Wichtigste, worauf Sie achten sollten, sind Vorgänge, die persistente Strukturen (z. B. Datenbanken) verändern.
Abwärtsinkompatible Änderungen
Der Übergang von einem behebbaren schwerwiegenden Fehler zu einer Fehlerausnahme ist technisch gesehen BC-brechend.
Übersetzung: https://wiki.php.net/rfc/tostring_Exceptions
Das obige ist der detaillierte Inhalt vonPHP 7.4 ermöglicht das Auslösen von Ausnahmen von __toString(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!