public static function validate($nif)
    {
        $nifCodes = 'TRWAGMYFPDXBNJZSQVHLCKE';

        if (9 !== strlen($nif)) {
            return false;
        }
        $nif = strtoupper(trim($nif));

        $sum = (string) self::getCifSum($nif);
        $n = 10 - substr($sum, -1);

        if (preg_match('/^[0-9]{8}[A-Z]{1}$/', $nif)) {
            // DNIs
            $num = substr($nif, 0, 8);

            return $nif[8] == $nifCodes[$num % 23];
        } elseif (preg_match('/^[XYZ][0-9]{7}[A-Z]{1}$/', $nif)) {
            // NIEs normales
            $tmp = substr($nif, 1, 7);
            $tmp = strtr(substr($nif, 0, 1), 'XYZ', '012').$tmp;

            return $nif[8] == $nifCodes[$tmp % 23];
        } elseif (preg_match('/^[KLM]{1}/', $nif)) {
            // NIFs especiales
            return $nif[8] == chr($n + 64);
        } elseif (preg_match('/^[T]{1}[A-Z0-9]{8}$/', $nif)) {
            // NIE extraño
            return true;
        }

        return false;
    }