Widziałem zastosowania @
przed niektórymi funkcjami, takimi jak:
$fileHandle = @fopen($fileName, $writeAttributes);
Do czego służy ten symbol?
php
operators
error-suppression
sv_in
źródło
źródło
Odpowiedzi:
Pomija komunikaty o błędach - patrz Operatory kontroli błędów w podręczniku PHP.
źródło
isset()
nie jest konieczne, aby uniknąćundefined offset
błędów.Pomija błędy.
Zobacz Operatory kontroli błędów w instrukcji:
źródło
@
Symbolem jest kontrola błędu operatora (aka „cisza” lub „shut up” operator). To powoduje, że PHP pomija wszelkie komunikaty o błędach (zawiadomienie, ostrzeżenie, błąd itp.) Generowane przez powiązane wyrażenie. Działa podobnie jak operator jednoargumentowy, na przykład ma pierwszeństwo i asocjatywność. Poniżej kilka przykładów:Co dokładnie się stanie, jeśli użyjesz niestandardowej procedury obsługi błędów zamiast standardowej procedury obsługi błędów PHP:
Ilustruje to poniższy przykład kodu:
Program obsługi błędów nie sprawdził, czy
@
symbol działa. Podręcznik sugeruje, co następuje:źródło
Pamiętaj również, że pomimo ukrytych błędów, dowolna niestandardowa procedura obsługi błędów (ustawiona za pomocą
set_error_handler
) będzie nadal wykonywana!źródło
Jak już niektórzy wcześniej odpowiedzieli:
@
Operator pomija wszystkie błędy w PHP, w tym powiadomienia, ostrzeżenia, a nawet błędy krytyczne.ALE: Proszę, naprawdę wcale nie używaj
@
operatora.Dlaczego?
Cóż, ponieważ kiedy używasz
@
operatora do eliminacji błędów, nie masz pojęcia, od czego zacząć, kiedy wystąpi błąd. Miałem już trochę „zabawy” ze starszym kodem, w którym niektórzy programiści@
dość często korzystali z operatora. Zwłaszcza w przypadkach takich jak operacje na plikach, połączenia sieciowe itp. Są to wszystkie przypadki, w których wielu programistów zaleca użycie@
operatora, ponieważ czasami jest to poza zakresem, gdy wystąpi tutaj błąd (na przykład interfejs API innej firmy może być nieosiągalny itp. ).Ale po co to nadal go nie używać? Spójrzmy z dwóch perspektyw:
Jako programista: kiedy
@
jest używany, absolutnie nie mam pojęcia, od czego zacząć. Jeśli istnieją setki, a nawet tysiące wywołań funkcji z@
błędem, to może być tak samo. W tym przypadku nie jest możliwe rozsądne debugowanie. A nawet jeśli jest to tylko błąd trzeciej strony - jest w porządku i szybko. ;-) Ponadto lepiej jest dodać wystarczającą ilość szczegółów do dziennika błędów, aby programiści mogli łatwo zdecydować, czy wpis w dzienniku jest czymś, co należy sprawdzić dalej, czy tylko niepowodzeniem innej firmy, które jest poza zakresem dewelopera.Jako użytkownik: użytkownicy w ogóle nie dbają o przyczynę błędu. Oprogramowanie jest dla nich do pracy, do ukończenia określonego zadania itp. Nie obchodzi ich, czy to wina programisty, czy problem trzeciej strony. Szczególnie dla użytkowników zdecydowanie zalecam rejestrowanie wszystkich błędów, nawet jeśli są poza zakresem. Być może zauważysz, że określony interfejs API jest często offline. Co możesz zrobić? Możesz porozmawiać ze swoim partnerem API, a jeśli nie są w stanie utrzymać stabilności, prawdopodobnie powinieneś poszukać innego partnera.
W skrócie: powinieneś wiedzieć, że istnieje coś takiego
@
(wiedza jest zawsze dobra), ale po prostu jej nie używaj . Wielu programistów (szczególnie tych debugujących kod od innych) będzie bardzo wdzięcznych.źródło
@
jest właściwe tak, jest to szczególnie przydatne, zwłaszcza jeśli nie wracasztext/html
(lub nie jest podobny) do klienta. (może powrótimage/png
lub „json”)if( session_status() == PHP_SESSION_NONE ) session_start();
Odziedziczyłem tę starszą aplikację. Są miejsca, w których skrypt instalacyjny jest wywoływany wiele razy, więc muszę przetestować. Jakim ewentualnym problemem byłoby po prostu korzystanie@session_start();
?@$this->stats['device_os'][$date][$creative_id][$device_id][$operating_system]['clicks']++;
jest znacznie lepsza niż alternatywa polegająca na sprawdzaniu isset na każdym poziomie i wypełnianiu go, gdy nie jest.Załóżmy, że nie użyliśmy operatora „@”, wówczas nasz kod wyglądałby następująco:
A jeśli plik, który próbujemy otworzyć, nie zostanie znaleziony? Wyświetli się komunikat o błędzie.
Aby ukryć komunikat o błędzie, używamy operatora „@”, takiego jak:
źródło
@
obejście w pierwszej kolejności. Inne języki programowania mają jednolitą obsługę wyjątków, aby poradzić sobie z tego rodzaju scenariuszem stackoverflow.com/questions/1087365Jeśli otwarcie się nie powiedzie, generowany jest błąd poziomu E_WARNING. Możesz użyć @, aby ukryć to ostrzeżenie.
źródło
@
pomija komunikaty o błędach.Jest używany w fragmentach kodu, takich jak:
Jeśli domena „ http://www.exaple.com ” nie jest dostępna, zostanie wyświetlony błąd, ale
@
nic nie zostanie pokazane .źródło
PHP obsługuje jeden operator kontroli błędów: znak at
(@)
. Po dodaniu do wyrażenia w PHP wszelkie komunikaty o błędach, które mogą zostać wygenerowane przez to wyrażenie, zostaną zignorowane.Jeśli ustawisz niestandardową funkcję obsługi błędów,
set_error_handler()
to nadal będzie wywoływana, ale ta niestandardowa procedura obsługi błędów może (i powinna) wywoływać,error_reporting()
która zwróci się,0
gdy wywołanie, które wywołało błąd, było poprzedzone znakiem@
.Uwaga:-
1) Operator @ działa tylko na wyrażeniach.
2) Prosta zasada: jeśli możesz wziąć wartość czegoś, możesz do tego dołączyć operator @. Na przykład możesz dodać do zmiennych, funkcji i zawierać wywołania, stałe i tak dalej. Nie możesz przygotować go do definicji funkcji lub klas ani struktur warunkowych, takich jak if i foreach i tak dalej.
Ostrzeżenie:-
źródło
Warto dodać tutaj, że podczas korzystania z @ należy pamiętać o kilku wskazówkach, aby zapoznać się z pełnym przeglądem tego postu: http://mstd.eu/index.php/2016/06/30/php- rapid-fire-what-is-the-symbol-used-for-in-php /
Program obsługi błędów jest nadal uruchamiany, nawet jeśli poprzednio wstawiono symbol @, oznacza to po prostu, że ustawiony jest poziom błędu 0, będzie to wymagało odpowiedniej obsługi w niestandardowej procedurze obsługi błędów.
Wcześniejsze dołączenie za pomocą @ ustawi wszystkie błędy w pliku dołączania na poziom błędu 0
źródło
@
pomija komunikat o błędzie generowany przez funkcję.fopen
zgłasza błąd, gdy plik się nie kończy.@
Symbol powoduje wykonanie przejścia do następnego wiersza, nawet jeśli plik nie istnieje. Moja sugestia nie używałaby tego w środowisku lokalnym podczas tworzenia kodu PHP.źródło