← Tilbage til koncepter

Namespaces

Organisering af kode og undgåelse af navnekonflikter med namespaces

Kategori: Fundamentals

🎯 Key Points

  • Namespace declaration - Definer namespace i toppen af filen med namespace keyword
  • Use statements - Importer klasser fra andre namespaces for nem adgang
  • Aliasing - Giv importerede klasser et alternativt navn med as keyword
  • Global namespace - Root namespace uden præfiks, tilgås med backslash
  • Sub-namespaces - Hierarkisk organisering med backslash separator
  • Autoloading med PSR-4 - Automatisk mapping mellem namespaces og fil struktur
  • Namespace resolution - Fully qualified, qualified og unqualified navne
  • Multiple use declarations - Group use statements for samme namespace
  • Function og constant imports - Import ikke kun klasser men også funktioner og konstanter
  • Namespace conflicts - Håndter samme klassenavn fra forskellige namespaces med aliasing

💻 Kode Eksempel

<?php

// File: src/Services/Email/EmailService.php
namespace App\Services\Email;

use App\Models\User;
use App\Contracts\MailerInterface;
use App\Exceptions\EmailException;
use DateTime;
use function sprintf;
use const PHP_EOL;

class EmailService implements MailerInterface {
    private array $sent = [];
    
    public function send(User $user, string $subject, string $body): bool {
        try {
            $message = sprintf(
                "To: %s%sSubject: %s%s%s%s",
                $user->email,
                PHP_EOL,
                $subject,
                PHP_EOL,
                PHP_EOL,
                $body
            );
            
            $this->sent[] = [
                'user' => $user->name,
                'subject' => $subject,
                'sent_at' => new DateTime()
            ];
            
            echo "Email sent: {$subject}" . PHP_EOL;
            return true;
            
        } catch (\Exception $e) {
            throw new EmailException("Failed to send email: " . $e->getMessage());
        }
    }
    
    public function getSentCount(): int {
        return count($this->sent);
    }
}

// File: src/Models/User.php
namespace App\Models;

class User {
    public function __construct(
        public string $name,
        public string $email
    ) {}
}

// Usage with group use statements
use App\Services\Email\{EmailService, EmailQueue};
use App\Models\{User, Order, Product};

$emailService = new EmailService();
$user = new User('John Doe', 'john@example.com');
$emailService->send($user, 'Welcome!', 'Thanks for signing up.');

💼 Hvornår bruges det?

  • Framework organisering - Laravel, Symfony og andre frameworks bruger namespaces til at strukturere deres komponenter
  • Package development - Composer packages bruger vendor\package namespace struktur
  • Large-scale applications - Opdel applikationen i moduler med hver sit namespace (Admin, API, Frontend)
  • Third-party integration - Undgå konflikter når multiple libraries har klasser med samme navn
  • Domain-driven design - Organiser kode efter business domæner (Billing, Shipping, Inventory)
  • Testing - Separate test namespaces (Tests\Unit, Tests\Feature) fra application kode

⭐ Best Practices

  • Følg PSR-4 standard for namespace til directory mapping - ét namespace per directory
  • Brug vendor navn som root namespace for packages (YourCompany\PackageName)
  • Hold namespace hierarkiet fladt - undgå for mange niveauer af sub-namespaces
  • Group related use statements sammen for bedre læsbarhed
  • Brug aliasing til at håndtere lange klassenavne eller navnekonflikter
  • Placer namespace declaration som første statement i filen (efter <?php)
  • Én klasse per fil med matching namespace og fil sti struktur
  • Brug leading backslash når du refererer til global namespace klasser (\DateTime, \Exception)

ℹ️ Quick Info

Kategori
Fundamentals
Sværhedsgrad
Begynder