Namespaces kun je vergelijken met de directorystructuur op je hardeschijf. Use geeft aan welke implementatie van een class je wilt gebruiken. Je kunt meerdere classes met dezelfde naam hebben zolang ze in andere namespaces zitten.
Het wordt erin gezet voor de duidelijkheid van je code. Zeker als je een grote codebase hebt is het handig om namespaces te gebruiken voor bijvoorbeeld het framework, de models etc. Wanneer je een goede IDE hebt maakt dit het bouwen veel eenvoudiger.
Stel dat wij voor hetzelfde project een class maken met daarin een paar eigen functies en we zouden die class allebei MyFunctions noemen. Als we nu een class zouden aanmaken via $my_functions = new MyFunctions() maken we dan jouw class aan of de mijne? Nu komen namespaces van pas. Dankzij namespaces kunnen beide classes in het project voorkomen, maar worden ze gekoppeld aan hun eigen namespace.
Functioneel voegt het niet veel toe, niet op dezelfde manier als dat een language construct als for, if of foreach dat doen. Het is "syntactic sugar", je kunt namelijk Ozzie aangeeft zonder verdere hacks meerdere classes met dezelfde naam hebben. Dit is handig in de grotere codebases, en als je naam een framework als Symfony of Laravel kijkt kun je zien hoe namespaces goed gebruikt kunnen worden.
Er is nog een voordeel van namespaces die hier niet genoemd wordt. In de grotere projecten (maar ook in frameworks als Symfony) staat iedere class in een apart bestand. Dus de MyFunctions staat in MyFunctions.php.
Om nou niet iedere class die je wilt gaan gebruiken handmatig te includen met
Als de MyFunctions class in de AppBundle/Core namespace gedeclareerd wordt dan is de volledige classnaam AppBundle/Core/MyFunctions. een handig geschreven autoloaderfunctie maakt hier zo een filepath van (bijvoorbeeld C:\myprojects\current\AppBundle\Core\MyFunctions.php) en include vervolgens het bestand wanneer dit nog niet gedaan was.
Namespaces zijn dus ook heel handig in combinatie met een autoloader. (Nooit meer includes gebruiken yeaahh!)
Echter gebruikt Symfony een iets geavanceerdere autoloader, die een gegeven path recursief doorzoekt op classes, en hier een classmap van maakt. Gewoon met de hulp van token_get_all(). Hierdoor kunnen classes in willekeurige folders staan en nog steeds gevonden worden als je een nieuwe map aanmaakt. De methode die je noemt vind ik zelf overigens ook niet heel prettig, omdat een standaard opbouw "Company\Component\SubComponent" is, terwijl je dan iets krijgt als "App\Classes\Etc1\Etc2". Uiteraard zijn hier de verschillende PSR standaarden voor, maar Symfony doet het in ieder geval in één van zijn loaders op de beschreven manier.