Heim Backend-Entwicklung PHP7 PHP 7.4 ermöglicht das Auslösen von Ausnahmen von __toString()

PHP 7.4 ermöglicht das Auslösen von Ausnahmen von __toString()

Nov 30, 2019 pm 02:41 PM
PHP 7.4

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";
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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.
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)