На уровне языка пространства имён с файловой системой никак не связаны.
Пространства имён - лишь способ решить конфликты имён классов.
Вот ты говоришь - у меня есть класс ClassName, но к сожалению, такой класс уже есть в одной из библиотек, которые ты используешь. Можно было бы назвать класс MyClassName, ну и везде добавлять приставку My. Редко, но бывает что надо сделать два класса с одинаковым именем в одном проекте. Тогда ты называешь один класс MyBananaSybsystemClassName, а другой MyAnanasSubsystemClassName - тем самым обозначая разницу в названии.
И даже это не спасёт от простого совпадения.
И тут на помощь приходят пространства имён.
В начале файла в котором лежат классы (лучше один класс в одном файле) пишется название пространсва имён, вот так:
namespace banana;
И теперь все классы, объявленные в этом пространстве имён имеют название banana\ClassName, хотя внутри этого файлв ты можешь по прежнему обращаться к ним просто по ClassName.
В другом файле надо использовать полное название, вроде как:
$obj = new banana\ClassName();
но, если надо много раз писать название класса можно сделать вот так:
use banana\ClassName;
$obj = new ClassName();
, но самое полезное здесь это разрешение конфликтов. Если вдруг в другом месте определён такой же ClassName, то можно просто переименовать его:
use banana\ClassName;
use ananas\ClassName as AnanasClass;
$obj1 = new ClassName();
$obj2 = new AnanasClass();
Вот это и есть суть пространства имён. Таковы они во всех языках программирования в которых они есть.
Но есть от них ещё одна польза - можно настроить автоматическое подключение
unclude();
файла с классом.
Делается это с помощью определения функции автозагрузки
function __autoload($classname){
// как-то по имени класса находим файл и подключаем
}
// или, лучше
spl_autoload_register(function ($classname) {
// как-то по имени класса находим файл и подключаем
});
Каждый раз, когда ты обращаешься к классу и php не может его найти в подключенных файлах - запускается код написанный в функции автозагрузки. В эту функцию передаётся название класса.
При чём же тут пространства имён? А при том, что в функцию автозагрузки передаётся полное имя класса с пространтсвом имён.
Это значит что ты можешь делать по одному файлу на класс, класть их в папки, а в пространство имён в каждом файле писать путь до этого файла.
После этого пишешь функцию, которая просто заменяет в названии класса слеши на те, что поддерживаются операционной системой как разделители пути, и просто подключаешь файл.
Именно об этом и написано в каком-то там PSR