Cosa fa il prefisso '@' in PHP?

Cosa fa il simbolo '@' nel seguente codice?

@mkdir(ROOT. "cache/"); 

Elimina gli errori dalla visualizzazione :

PHP support un operatore di controllo degli errori: il simbolo at (@). Se anteposto a un'espressione in PHP, tutti i messaggi di errore che potrebbero essere generati da quell'espressione verranno ignorati.

Se la function track_errors è abilitata, qualsiasi messaggio di errore generato dall'espressione verrà salvato nella variabile $ php_errormsg. Questa variabile verrà sovrascritta su each errore, quindi controlla presto se vuoi usarlo.

Come notato nei commenti, anch'io non riesco a immaginare un motivo per utilizzare effettivamente questa funzionalità: scrivere codice che si adatti in modo appropriato agli stati / condizioni di errore.

Come sottolineato, è l'operatore di soppressione degli errori.

Ma ciò che non è stato sottolineato, è che è una pratica molto ctriggers da usare – gli errori non devono fallire silenziosamente.

Verifica i ritorni degli errori e utilizza i blocchi try / catch in cui vengono utilizzate le eccezioni.

Nell'esempio specifico …

 @mkdir(ROOT. "cache/"); 

… ignora eventuali errori di mkdir() . I documenti dicono che restituisce FALSE in caso di fallimento, quindi dovresti fare …

 if ( ! mkdir(ROOT. "cache/")) { // Handle error. } 

La gente sembra dimenticare che PHP era un linguaggio veloce e sporco per fare le cose, solo recentemente ha cercato di essere maturo e sofisticato.

La soppressione degli errori è un modo rapido e sporco per far sì che le funzioni si comportino nel modo in cui ne hai bisogno, perché nello sviluppo web non puoi prevedere cosa ti verrà lanciato, ea volte non vale la pena di preoccuparti!

Un classico esempio è la function utile getimagesize, che ti consente di get alcune informazioni su un'image che qualcuno ha caricato. Questa function blocca un wobbly se il file di image non è un file di image standard. Non è in realtà il ruolo degli sviluppatori di ispezionare un file, determinare se può essere caricato in getimagesize. Potrebbero esserci modi eleganti per farlo, ma seriamente non mi interessa!

fai questo:

 if( !($a = @getimagesize( $_FILE['file']['tmp_name'] ))) { unlink( $_FILE['file']['tmp_name'] ); //politely tell user that you rejected their image! } 

si, puoi usare try e catch statement che sono più eleganti, ma alla fine hai colto l'errore e soppresso il messaggio di errore, che è quello che volevi senza logorare la tab-key!

Contrariamente a quanto sopra le risposte dicono, il prefisso @ usato con attenzione non risulta in un relitto in fuga. Permette solo allo sviluppatore di gestire gli errori nel modo che preferiscono.