Ich bin auf einen wirklich interessanten Bug in PHP 7.0.11 gestoßen, bei dem declare(strict_types=1);
enabled die array_map()
oder array_walk()
nicht auf striktes Tippen aufmerksam macht. Ich habe irgendwo gelesen, dass PHP strikte Typprüfungen in Kernfunktionen ermöglicht, aber das ist nicht der Fall.
Schauen Sie sich diesen Beispielcode an, er sollte die TypeError-Ausnahme auslösen:
Das var_dump
Ergebnis ist:
Alle Integer-Werte werden in Zeichenketten umgewandelt, was offensichtlich ein Problem darstellt. Dies wirft die Frage auf, sollte ich declare(strict_types=1);
alle zusammen fallen lassen und is_*
functions verwenden und Ausnahme auslösen?
Es ist kein Fehler (Hut zu Zimmer 11 , um mich in die richtige Richtung zu weisen)
>Hier ist der RFC für strikte Typen . Es ist wirklich, wirklich lang und der strittigste RFC in der Geschichte von PHP (und ich meine es ernst). Hier sind die relevanten Teile ausgeschnitten für Sie
Dieser Vorschlag baut standardmäßig eine Schwachstellenprüfung auf (unter Verwendung derselben Regeln), für interne und Benutzerfunktionen .
-
Ein bedeutender Teil der PHP-Community scheint vollständig strikte Typen zu bevorzugen. Das Hinzufügen strikt typgeprüfter Skalar-Typ-Deklarationen würde jedoch einige Probleme verursachen:
Vorhandener Code, der (vielleicht unbeabsichtigt) die schwache Typisierung von PHP ausnutzt, würde brechen, wenn er Funktionen deklarierte Skalar-Typ-Deklarationen zu Parametern aufruft. Dies würde das Hinzufügen von Skalar-Typ-Deklarationen zu den Parametern von Funktionen in existierenden Codebasen komplizieren, insbesondere Bibliotheken.
Das ist also kein Fehler. Dies war Teil des großen Kompromisses, der dies möglich gemacht hat (Baby schreitet zu strengerem Tippen vor, wenn Sie so wollen). Funktionen ignorieren striktes Tippen. Ja, es ist inkonsistent mit anderen Sprachen (eine Tatsache, die der RFC im Detail festhält), aber so hat die PHP-Community entschieden, dass es vorerst sein sollte.