PHP Sollten alle Funktionen zuerst ihre Parametertypen prüfen?

8

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?

    
Nick Shears 20.11.2013, 14:38
quelle

6 Antworten

3
___ answer20099404 ___

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.

    
___ qstntxt ___

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?

    
___ qstnhdr ___ PHP Sollten alle Funktionen zuerst ihre Parametertypen prüfen? ___ answer20099154 ​​___

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

___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ tag123function ___ Eine Funktion (auch als Prozedur, Methode, Unterroutine oder Routine bezeichnet) ist ein Teil des Codes, der dazu bestimmt ist, eine einzelne, spezifische Aufgabe auszuführen. Verwenden Sie dieses Tag für Fragen, die speziell das Erstellen oder Aufrufen von Funktionen betreffen. Wenn Sie Hilfe beim Implementieren einer Funktion zum Ausführen einer Aufgabe benötigen, verwenden Sie stattdessen [algorithm] oder ein aufgabenspezifisches Tag. ___ answer20098983 ___

Verwenden Sie die is_string () - Validierung für Funktionsparameter

    
___ answer20099738 ___

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.

    
___ answer20099103 ___

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.

    
___ tag123typehinting ___ Typhinweis bindet Funktionsargumente an bestimmte Objekte oder gibt sie stark ein. ___ answer20099087 ___

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:

Die Methode set_error_handler:

Beschrieben unter: Ссылка

%Vor%

PHPTypeSafe-Methode

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: Ссылка

SPL Typen Methode

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

finden

Der 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

    
___
Chris Baker 20.11.2013, 14:52
quelle
3

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:

Die Methode set_error_handler:

Beschrieben unter: Ссылка

%Vor%

PHPTypeSafe-Methode

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: Ссылка

SPL Typen Methode

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

finden

Der 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

    
mcuadros 20.11.2013 14:50
quelle
1

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.

    
Spudley 20.11.2013 15:02
quelle
0

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.

%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.

    
Gajus 20.11.2013 14:50
quelle
0

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.

    
smassey 20.11.2013 15:16
quelle
-3

Verwenden Sie die is_string () - Validierung für Funktionsparameter

    
Nikolay Krasnov 20.11.2013 14:45
quelle

Tags und Links