Klar ist die
@Methode allgemein keine saubere Lösung, stimme Dir vollkommen zu. Und dennoch ist das @ ja genau dafür gedacht und nützlich wenn überhaupt nur ein bestimmtes Ergebnis optional erwartet wird. Und nein in PHP8 wird bei mir das @ignoriert.
(Sei es mal darum, dass es an irgend welchen Einstellungen liegen könnte, keine Ahnung!)
if(
@in_array(...,....))
{
....do....
}
RESULT: TypeError: in_array(): Argument #2 ($haystack) must be of type array, null given in
Weiteres Problem dass es ein Fatal Error ist. Das ärgert mich ja gewaltig. Da ich ja das @ genau dort absichtlich setze wo ich quasi einen TRY haben will und es nicht wichtig ist. Hier bricht PHP8 das Skript dann einfach ab. Und somit habe ich ein anderes Ergebnis als ich befohlen haben. Das ist echt traurig.
Prinzipiell nervt das nur und nützt keinem. Wenn ich zum Beispiel ein @ setze dann weis ich dass mir der Resultat ja völlig Banane ist. z.B.
@file_put_contents();
Hier setze ich das @da es mir ja vollkommen egal ist, ob die Datei gesetzt wird oder nicht. Ich kann es ja im Anschluss prüfen mit file_exsits. Deshalb ist das @in manchen Fällen wichtig. Man will ja nicht unbedingt deshalb den Ablauf eines Skriptes stoppen, nur weil ein unerwartetes Ergebnis eintrifft.
Wie es aussieht juckt das PHP8 nicht. Find ich einfach ärgerlich. Das ist keine Weiterentwicklung in meinen Augen sondern eine Ableitung von PHP7.
Prinzipiell macht es das Ganze nur aufwändiger. Wenn ich ein String mittels explode in ein array wandel, aber kein delimiter vorhanden ist, und dann prüfe ob ein value im array da ist, kann ich bislang ein @ vorstellen weil das Result ja das selbe ist. Entweder ist der explode ein array und das element vorhanden = true oder nicht vorhanden = false.
Ist der explode ein string da kein delimiter vorhanden dann juckt mich das ja nicht das soweiso ein false kommen müsste wegen des @ Zeichens. Es wird ja quasi versucht die Funktion auszuführen. Und hier haben wir dann doch einen logischen sauberen sinn. Glückt die Funktion nicht, dann ist mein Value ja sowieso nicht vorhanden. Dann muss ich ja auch nicht nach einem value suchen. Das Resultat ist ja das gleiche und bedeutet mein Value ist nicht im Array. Was interessiert mich dann ob die Variable ein Array ist? Das will ich doch gar nicht wissen.
Und as dieser Sicht ist das @ Zeichen schon eine saubere Lösung, da es ja nur etwas versucht durchzuführen, und mit der Erfolg im Code nicht von belangen ist. Letzt endlich möchte ich ja mit dem @ ein Abbruch verhindern. Das ist ja genau die Absicht dahinter. Klar gibt es dafür auch noch andere Wege aber jeder dieser ist ein vielfaches aufwendiger als das @
Folglich müsste das @Symbol nichts anderes wie ein TRY ohne Catch sein.
Auch ein anderes Beispiel zeigt warum das @nützlich ist.
PHP:
$datensatz = @file_get_contents('test.txt');
file_put_contents('test.txt',$datensatz .= ' weiterer Text');
Ich könnte natürlich sagen, ich prüfe erst einmal ob test.txt existiert. Wenn nicht lege ich die an.
Aber wozu? PHP schmückt sich doch selbst damit, dass man Variablen Typen nicht deklarieren muss. Also was interessiert mich als Programmierer, die if Abfrage, wenn die Datei doch sowieso nur erweitert und geschrieben wird wie in diesem Fall? Wenn doch test.txt nicht da ist, wird der Daten Satz später doch sowieso zum String gewandelt. Ich spare eine ganze if Abfrage.
Ich kann das natürlich auch in ein TRY setzen. Aber
Tatsache ist, dass es für mich in diesem Beispiel überhaupt nicht von belangen ist, ob test.txt nur vorhanden ist oder nicht. Denn wenn nicht, lege ich die so oder so an. Und selbst wenn, überschreibt file_put_contents diese ja sowieso. Und es ist genau so wenig von Belangen ob $datensatz nun Schriftinhalt hat oder nicht. Deswegen wieso soll es eine saubere Lösung sein, hier zu fragen ob test.txt vorhanden ist? Es spielt ja für die Ausführung kein Belangen. Wenn nicht lege die an und erweiterte den String egal ob zuvor ein empty drin ist oder nicht. Nichts anderes sagt der Code. Ob die Datei vorhanden ist interessiert mich ja nicht. Also warum soll man das fragen?
Und deshalb zeigt es warum das @ja sehr wohl aber auch eine saubere Lösung sein kann. Und sie ist für mich auch kein Code smell, da es ja die Lesbarkeit steigert. (Weniger Zeilen). Manche benutzen ja auch
? und : statt if und else
und das @ ist nicht anderes als ein try ohne catch
PHP:
$datensatz = @file_get_contents('test.txt');
file_put_contents('test.txt',$datensatz .= ' weiterer Text');
So jetzt kann ich es interpretieren. Der Code sagt erstelle eine Variable namens Daten Satz. Wenn die Datei existiert fülle diese Variable mit dem Inhalt der Datei. Schreibe die Datei mit Variable und hänge etwas Text an.
Würden wir das @ weg nehmen, dann könnte PHP melden, dass die test.txt nicht vorhanden ist, und sogar falls dies ein fatal error sei, das Skript abbrechen an dieser Stelle, obwohl das für mich keine Rolle spielt. Aus dieser Sicht ist das @ sogar überlebensnotwendig. Da der Trhwon der hier geworfen wird, überhaupt kein Problem darstellt. Generell kann man sagen das @ist nützlich wenn die Erwartung optional ist. In diesem Fall ist die Erwartung aus der text.txt optional.