Allora:
Il controllo sul tipo di file caricato si fa per due motivi:
a) per accettare solo file che ci si aspetta
b) per non accettare file pericolosi

Mettiamo che tu stai sviluppando un'applicazione dove gli utenti ti caricano archivi, e vuoi accettare solo zip/rar.
Ora, se tu fai il controllo sul mime, quest'ultimo, essendo un dato inviato dal browser, e' facilmente modificabile. Quindi uno puo' tranquillamente caricarti un file qualcosa.php con il mime application/zip.
Se tu salvi sto file sul disco del server, sei messo male: gli hai dato la possibilita' di chiamare tuosito.it/qualcosa.php con qualsiasi codice dentro.

Se invece fai il controllo sull'estensione, anche se uno ti carica il file qualcosa.php cambiando estensione (quindi qualcosa.zip) non se ne fa niente del file caricato, perche' il server non interpreta il file come php.

Poi naturalmente si possono fare dei controlli aggiuntivi in base ai file che ci si aspetta.

In conclusione:
Fare solo controllo sul mime - male
Fare controllo sull'estensione - bene
Fare controllo sul mime dopo aver fatto quello sull'estensione - inutile. E poi considera anche che a volte il mime non funziona come ti ci aspetti anche in casi "legali", ad esempio ie per le jpeg manda una mime tutta sua (image/pjpeg o qualcosa del genere, non ricordo piu' - il punto e' che manda un'altro mime rispetto agli altri browser)