Но ведь в итоге каждый файл пустой, почему нельзя использовать один для всех? И почему все таки он пустой?
Потому что каждый новый класс - это не новая переменная одного и того же типа, как массив, а новый тип переменной. И вот по типам их и различают. То есть, класс "не пустой" получается. В привычных тебе терминах это будет что-то вроде присвоения переменной класса каждый раз нового значение,
$this->type = "Exception1";
и потом различать их по этой переменной. Но этот код избыточен. Достаточно просто написать
class Exception1
- это уже будет определение типа.