Avatar billede Mik2000 Professor
23. marts 2019 - 00:15 Der er 5 kommentarer og
1 løsning

Namespaces - hvad gør det?

Hej

Måske lidt dumme spørgsmål, men har læst lidt om det og kan ikke helt blive klog på det.

Hvad er det præcis namespaces gør?

Hvornår bruger man dem, og hvilken værdi giver det?

Kan man undgå at skulle have "paths problemer" når man referere til filer ved at bruge dem?
Avatar billede Slater Ekspert
23. marts 2019 - 01:03 #1
De "gør" sådan set ingenting, det er bare en gruppering af kode. Det primære formål er at undgå navnekonflikter. Hvis du f.eks. laver noget kode der bruger to libraries, og hvert af de libraries har en klasse der hedder f.eks. Formatter - en meget normal ting at have.
Uden namespaces - ups, det kan du ikke - de hedder det samme.
Med namespaces hedder den ene i virkeligheden SomeLibrary\Formatter, og den anden hedder AnotherLibrary\Formatter - intet problem.

Det er dog ikke kun når du bruger eksterne libraries at det giver mening. Det kan ofte give mening at have flere klasser med samme navn i en kode - og mange autoloader-standarder benytter namespaces der svarer til folderstrukturer, så du nemt ved hvor filerne ligger, og autoloaderen kan finde dem.
F.eks. hvis du har en klasse der hedder MyClass i namespace \Mik2000\MyNamespace - så ved autloaderen (og du) at filen der indeholder klassen ligger i /Mik2000/MyNamespace/MyClass.php
Det er dog kun én standard og ikke spor nødvendigt at det fungerer sådan.

Hvornår det bruges? Sådan set altid. Med mindre du har en god grund til at lade være med at bruge dem, som at du ved dit projekt aldrig bliver større end et par filer, bør de generelt bruges.
Avatar billede Mik2000 Professor
23. marts 2019 - 11:57 #2
Tak for svaret.

Dvs. at det primære formål er at sikre at hvis 2 klasser hedder det samme, så kan det lade sig gøre fordi de har forskellige namespaces.

Et andet spørgsmål
Man kan ikke bruge det til at løse strukturering af filer, således at hvis man har undermapper, så skal man ikke sætte en variabel eller define med root, og hele tiden loade ift. den vel?
Avatar billede Slater Ekspert
23. marts 2019 - 12:11 #3
Ikke sikker på jeg forstod det sidste. Jeg kan gætte, men vil du lige uddybe, så jeg er sikker på ikke at svare på noget helt andet?
Avatar billede Mik2000 Professor
23. marts 2019 - 12:29 #4
Ja selvfølgelig. Det var også lige et sidespørgsmål om noget lidt andet :)

Hvis man f.eks. har en eller anden mappe struktur

-root
  - assets
      - js
  - includes
      - classes
  - settings

Når man så skal require filer, så sætter jeg pt. en variabel som finder root, og bruger den til altid at hente det rigtige i require/include, hvilket er en lidt træls løsning.

Jeg tænker namespace tankegangen hvor man i filen kunne sætte et namespace og blot skrive det inden filen og så fandt den den rigtige sti uanset om filen flyttes, og uden at skulle lave variabler.
Er der noget smart til det, eller hvad er den bedste løsning
Avatar billede Slater Ekspert
23. marts 2019 - 13:20 #5
Ja, det er lige sådan noget en autoloader kan hjælpe dig med - dog kun med PHP klassefiler, ikke script- og CSS-filer, og heller ikke PHP-filer som ikke indeholder klasser.

Men hvis du f.eks. bruger en autoloader-standard som PSR-4, der nok er den mest udbredte i PHP-land, så svarer mappestruktur til namespace-struktur, så som jeg nævnte før, en klasse der hedder:
<?php
namespace Mik2000\MyNamespace;
class SomeClass {}

vil ligge i <projektets rodmappe>/Mik2000/MyNamespace/SomeClass.php

Når du så skal bruge den klasse et andet sted, skriver du bare:
$someObject = new \Mik2000\MyNamespace\SomeClass();

- Eller bruger use-statements til det samme. Så finder autoloaderen automatisk den rigtige fil for dig og inkluderer den.

Hvis du ikke allerede gør det, vil jeg stærkt anbefale at bruge Composer til dine PHP-projekter. Den kommer også med en PSR-4 autoloader indbygget.
Avatar billede arne_v Ekspert
14. april 2019 - 04:22 #6
Det er vaerd at bemaerke at namespaces ikke er en PHP opfindelse men et generelt begreb i OOD & OOP.

I C++ og C# hedder det ogsaa namespaces.

I Java og UML hedder det packages.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester