Ich habe eine Sammlung von String-Funktionen aufgebaut, die verschiedene Dinge erledigen, und mir ist aufgefallen, dass ich keine internen Funktionsprüfungen habe, die sicherstellen, dass die Variable eine Zeichenkette ist, bevor etwas damit gemacht wird.
In einigen Fällen habe ich während der Entwicklung versehentlich etwas anderes als eine Zeichenfolge übergeben, was zu einem Fehler führte.
Nun, ich frage mich, ob das etwas ist, was ich die ganze Zeit tun sollte. Überprüfen Sie zunächst, ob der richtige Datentyp gesendet wurde. Suchen Sie nach Dingen, die möglicherweise zuerst schiefgehen könnten, und protokollieren Sie sie dann. Wenn alles in Ordnung ist, machen Sie etwas damit.
Soll ich daran festhalten?
In Ermangelung von Real-Typ-Hinting für skalare Variablen können Sie dafür doc-comments verwenden. Wenn Sie eine anständige IDE verwenden, erhalten Sie vernünftige Typwarnungen von der IDE; Selbst wenn PHP sie selbst nicht durchsetzt, reicht das in der Regel aus, damit Sie keine Heuler machen.
Zum Beispiel:
%Vor%In Anbetracht des oben Gesagten gibt eine anständige IDE Code-Vervollständigung / Typ Hinweise für das Argument, als ob es als Ganzzahl eingeschränkt wäre. Es wird Sie nicht völlig davon abhalten, versehentlich eine Zeichenfolge zu übergeben, aber wenn es weiß, dass Sie den falschen Typ übergeben, wird es Sie warnen.
Ich habe eine Sammlung von String-Funktionen aufgebaut, die verschiedene Dinge erledigen, und mir ist aufgefallen, dass ich keine internen Funktionsprüfungen habe, die sicherstellen, dass die Variable eine Zeichenkette ist, bevor etwas damit gemacht wird.
In einigen Fällen habe ich während der Entwicklung versehentlich etwas anderes als eine Zeichenfolge übergeben, was zu einem Fehler führte.
Nun, ich frage mich, ob das etwas ist, was ich die ganze Zeit tun sollte. Überprüfen Sie zunächst, ob der richtige Datentyp gesendet wurde. Suchen Sie nach Dingen, die möglicherweise zuerst schiefgehen könnten, und protokollieren Sie sie dann. Wenn alles in Ordnung ist, machen Sie etwas damit.
Soll ich daran festhalten?
Sie können sehen, dass dies ein etwas fragwürdiges Thema ist. Das ist meine Meinung:
Typ Hinting
Verwenden Sie Typhinweise, wenn möglich. Typ-Hinweise sind in PHP für primitive Typen nicht möglich, also sollten Sie sicherstellen, dass Sie gültige Argumente erhalten haben. Wenn dies nicht der Fall ist, kann Ihre Funktion eine Ausnahme auslösen oder einen Standardwert wie null oder false zurückgeben.
Defensive Programmierung
Die Idee, testbaren Code zu schreiben, ist, dass Fehler nicht leise oder mysteriös sind. Es gibt keinen Grund, explizite Argumentvalidierung zu vermeiden: seien Sie ausführlich und Ihr Code ist klarer und verwendbar.
Zusätzlich zur Überprüfung Ihrer Argumente können Sie einen Fehlerhandler implementieren, um die Kantenfälle zu erfassen. Sie sollten jedoch die meisten Argumente überprüfen, insbesondere wenn sie sich auf persistente Daten auswirken (wie Ihre Datenbank).
Murphys Gesetz ist in voller Wirkung, deshalb musst du mit so vielen vorhersehbaren Fehlern kämpfen, wie du kannst. Ein ungültiges Argument ist ein leicht vorhersehbarer Fehler - ein Fehler bei der Überprüfung ist eine Zeitbombe in Ihrem Code. Der Aufruf von is_string
zum Beispiel ist einfach und diffundiert die Bombe.
Boxen
Eine weitere Überlegung ist, Ihre Variablen zu "boxen". Dies führt zu einem sehr ausführlichen Code, aber er hat den Vorteil, dass er Typhinweisen für Primitive erlaubt.
Ich habe noch nie jemanden gesehen, der das tut, obwohl es seine gesamte Codebasis hat, aber es ist da draußen. Es gibt SPL-Klassen für primative Typen, also würdest du folgendermaßen enden:
%Vor%SplTypes erzwingen den primitiven Typ und werfen Ausnahmen aus, wenn sie missbraucht werden. Aus der Dokumentation:
%Vor%SplTypes ist eine PECL-Erweiterung und nicht immer Teil einer standardmäßigen PHP-Installation. Überprüfen Sie daher Ihre Erweiterungen, bevor Sie sie verwenden. Die Erweiterung wird auch als experimentell betrachtet, obwohl sie schon seit einiger Zeit existiert.
Sie können auch ganz einfach Ihre eigene Box erstellen:
%Vor%... aber das hat einen großen funktionalen Unterschied darin, dass Sie nicht direkt einen neuen String-Wert wie diesen setzen können:
%Vor%Stattdessen müssen Sie eine Setter-Methode verwenden:
%Vor%Das alles führt uns zurück zu type hinting, was wahrscheinlich der effizienteste Weg ist, Ihre Argumente NICHT zu validieren.
Ähnliche Lektüre
Verwenden Sie die is_string () - Validierung für Funktionsparameter
Ich würde vorschlagen, alle Benutzereingaben in Ihre Funktionen zu übernehmen und die Parameter in Zeichenfolgen (um sicher zu sein), wo immer sonst ein Fehler auftreten würde. Es gibt wirklich keinen Grund, zum Beispiel eine der Funktionen nicht mit einem int aufzurufen und sie mit ihrer String-Repräsentation zu behandeln.
%Vor%Dies funktioniert sogar bei Klassen, die die Methode __toString () implementieren.
Nein, außer bei Randfällen, nicht.
Ich schlage vor, dass Sie Ссылка anstelle des standardmäßigen PHP-Fehlerhandlers verwenden. %code% beendet die Skriptausführung auch im Falle einer Benachrichtigung.
%Vor%Ich bevorzuge diesen Ansatz, weil es erlaubt, auf lange Sicht alle nicht ermittelten Fälle abzufangen und die entsprechende Bedingung zu schreiben, um sie zu behandeln.
Gegenwärtig gibt es in PHP keine Typ-Hinweise für Skalare, sondern war für PHP 5.4 geplant, wurde aber aufgrund der Dynamik von PHP-Variablen entfernt .
Eine PHP-RFC-Anfrage ist jetzt offen und es ist eine geplante Funktion für PHP 6 Ссылка
Einige Problemumgehungen sind verfügbar:
Beschrieben unter: Ссылка
%Vor%Eine andere Problemumgehung ist PHPTypeSafe . Dies ist eine alte Bibliothek für 5.3, aber eine deutliche Verlangsamung der PHP-Ausführung:
%Vor%Sie können das vollständige Beispiel lesen unter: Ссылка
Dies ist die standardmäßige und empfohlene Methode, das Problem besteht darin, dass Sie Ihre Variablen mit Objekten umschließen müssen. Dies ist Teil der SPL-Erweiterung: Ссылка
Dies ist ein kleines Beispiel:
%Vor%Sie können eine ausführlichere Information über SPL-Typen bei Chris answer
findenDer Vollständigkeit halber: Vor einiger Zeit hat Frau Sara Golemon , eine der besten PHP-Autoren, versucht, Autoboxing zu machen skalare Variablen ähnlich SPL-Typen. Es ist eine kleine Erweiterung in einem Alpha-Zustand:
Grüße
Gegenwärtig gibt es in PHP keine Typ-Hinweise für Skalare, sondern war für PHP 5.4 geplant, wurde aber aufgrund der Dynamik von PHP-Variablen entfernt .
Eine PHP-RFC-Anfrage ist jetzt offen und es ist eine geplante Funktion für PHP 6 Ссылка
Einige Problemumgehungen sind verfügbar:
Beschrieben unter: Ссылка
%Vor%Eine andere Problemumgehung ist PHPTypeSafe . Dies ist eine alte Bibliothek für 5.3, aber eine deutliche Verlangsamung der PHP-Ausführung:
%Vor%Sie können das vollständige Beispiel lesen unter: Ссылка
Dies ist die standardmäßige und empfohlene Methode, das Problem besteht darin, dass Sie Ihre Variablen mit Objekten umschließen müssen. Dies ist Teil der SPL-Erweiterung: Ссылка
Dies ist ein kleines Beispiel:
%Vor%Sie können eine ausführlichere Information über SPL-Typen bei Chris answer
findenDer Vollständigkeit halber: Vor einiger Zeit hat Frau Sara Golemon , eine der besten PHP-Autoren, versucht, Autoboxing zu machen skalare Variablen ähnlich SPL-Typen. Es ist eine kleine Erweiterung in einem Alpha-Zustand:
Grüße
In Ermangelung von Real-Typ-Hinting für skalare Variablen können Sie dafür doc-comments verwenden. Wenn Sie eine anständige IDE verwenden, erhalten Sie vernünftige Typwarnungen von der IDE; Selbst wenn PHP sie selbst nicht durchsetzt, reicht das in der Regel aus, damit Sie keine Heuler machen.
Zum Beispiel:
%Vor%In Anbetracht des oben Gesagten gibt eine anständige IDE Code-Vervollständigung / Typ Hinweise für das Argument, als ob es als Ganzzahl eingeschränkt wäre. Es wird Sie nicht völlig davon abhalten, versehentlich eine Zeichenfolge zu übergeben, aber wenn es weiß, dass Sie den falschen Typ übergeben, wird es Sie warnen.
Nein, außer bei Randfällen, nicht.
Ich schlage vor, dass Sie Ссылка anstelle des standardmäßigen PHP-Fehlerhandlers verwenden. ErrorException
beendet die Skriptausführung auch im Falle einer Benachrichtigung.
Ich bevorzuge diesen Ansatz, weil es erlaubt, auf lange Sicht alle nicht ermittelten Fälle abzufangen und die entsprechende Bedingung zu schreiben, um sie zu behandeln.
Ich würde vorschlagen, alle Benutzereingaben in Ihre Funktionen zu übernehmen und die Parameter in Zeichenfolgen (um sicher zu sein), wo immer sonst ein Fehler auftreten würde. Es gibt wirklich keinen Grund, zum Beispiel eine der Funktionen nicht mit einem int aufzurufen und sie mit ihrer String-Repräsentation zu behandeln.
%Vor%Dies funktioniert sogar bei Klassen, die die Methode __toString () implementieren.
Verwenden Sie die is_string () - Validierung für Funktionsparameter
Tags und Links php function type-hinting