Ist @ $ array ['possible_missing_key'] ein Anti-Pattern?

7

Ist es in Ordnung, @ zu verwenden, wenn ein möglicherweise fehlender Wert aus einem PHP-Array extrahiert wird? Beispiel:

%Vor%

Das beabsichtigte Verhalten:

%Vor%

Ich möchte es wissen, bevor ich das Nutzungsmuster verbreite.

    
Ivo Danihelka 14.12.2010, 16:31
quelle

6 Antworten

8

Der Operator @ unterdrückt Fehlermeldungen, und wenn Sie potenziell verwenden, wird Ihr Code für andere Fehler und unerwartetes Verhalten eingerichtet, die schwer aufzuspüren sind. So ist es sicherlich ein Antipattern.

Daher würde ich das zweite Bit sehr bevorzugen. Es macht es viel klarer

  • dass es möglicherweise nicht im Array vorhanden ist und
  • was der Standardwert ist, wenn er nicht vorhanden ist

Um es übersichtlicher zu gestalten, können Sie den ternären Bedingungsoperator ?: verwenden, wie in Mark Bakers Antwort . Etwas weniger Code und mehr Symbole, aber die Bedeutung ist gut erkannt.

    
BoltClock 14.12.2010, 16:34
quelle
6

Tatsächlich ist die isset Variation das Anti-Pattern. Wenn Sie nur isset($var)?$var:NULL verwenden, um den "Fehler" zu unterdrücken, haben Sie nichts erreicht, anstatt die richtige Syntax zum Unterdrücken von Fehlern zu verwenden. Es hat das gleiche Ergebnis, ist aber weniger lesbar.

Dafür streiten sich die Leute wegen der wahrgenommenen "Sauberkeit" und weil die Verwendung von isset eine Mikrooptimierung ist. Die Vermeidung von @ und die Verwendung von isset als Ersatz für syntaktischen Salz ist nur Cargo-Kult-Programmierung.

    
mario 14.12.2010 16:43
quelle
4

Oder

%Vor%     
Mark Baker 14.12.2010 16:35
quelle
1

Das Ignorieren von Warnungen ist definitiv ein Antipattern; also ja, es ist ein Anti-Muster (und ich kann garantieren, dass, wenn du lernst, Warnungen zu unterdrücken, einer von ihnen zurückkommt und dich in den hinteren Teil beißt, wenn nicht schlimmer).

Auch wenn die zweite Version ausführlicher ist, gibt sie der nicht initialisierten Variablen einen bekannten Zustand (oder kann verwendet werden, um das Problem zu lösen, wenn die Variable gefüllt werden soll).

    
Piskvor 14.12.2010 16:37
quelle
1

Die dritte Option:

%Vor%

Ich weiß, dass das die Frage nicht direkt beantwortet; Ich hätte es als Kommentar gesetzt, außer dass es wirklich formatiert werden musste.

Die Idee hier ist, dass, wenn Sie versuchen, Ihren Code zu verkürzen, indem Sie einen Einliner anstelle von einem if-else Block verwenden, dann können Sie es immer noch in einen prägnanten Einzeiler unter Verwendung eines ternären Operators bekommen und geben Sie das Beste aus beiden Welten.

    
Spudley 14.12.2010 16:38
quelle
1

Der zweite Codeblock (oder Mark Bakers Alternative, der genau gleich funktioniert) ist besser. Ich bin mir über PHP nicht ganz sicher, aber in vielen anderen Programmiersprachen würde das einfache Ignorieren einer Variablen einen Fehler auslösen. Zumindest mit dem zweiten Block initialisierst du die Variable auf einen Wert oder Speicherplatz.

Die Fehlerunterdrückung sollte häufiger verwendet werden, wenn Sie erwarten, dass eine Funktion einen erwarteten Fehler im Endprodukt verursacht (dies wird jedoch in der Regel nicht der Fall sein).

Viel Glück!
Dennis M.

    
RageD 14.12.2010 16:39
quelle