🏠 Home / Hub

🐘 PHP Lesson 12 — Namespaces & Composer

← Back to PHP Menu  |  🏠 Hub

1. Namespace ဆိုတာ ဘာလဲ?

Namespace = class/function name conflicts ကို ရှောင်ဖို့ virtual "folder" တစ်ခု
ကြီးမားသော projects မှာ different packages ထဲမှာ same class name ရှိနိုင် → namespace ဖြင့် distinguish
PSR-4 standard: namespace ↔ file path correspond
<?php
// File: src/Models/User.php
namespace App\Models;

class User {
    public function __construct(public string $name, public string $email) {}
    public function getInfo(): string { return "{$this->name} <{$this->email}>"; }
}

// File: src/Models/Post.php
namespace App\Models;  // same namespace OK

class Post {
    public function __construct(public string $title) {}
}

// File: src/Services/UserService.php
namespace App\Services;

use App\Models\User;           // import class
use App\Models\Post as PostModel;  // alias

class UserService {
    private array $users = [];

    public function create(string $name, string $email): User {
        $user = new User($name, $email);  // use imported class
        $this->users[] = $user;
        return $user;
    }

    public function findByEmail(string $email): ?User {
        foreach ($this->users as $user) {
            if ($user->email === $email) return $user;
        }
        return null;
    }
}

// File: index.php (root)
namespace App;  // or global namespace

use App\Services\UserService;
use App\Models\User;
use PDO;           // global class — need \ prefix or use statement

$service = new UserService();
$user = $service->create("Ko Ko", "ko@example.com");
echo $user->getInfo();  // "Ko Ko <ko@example.com>"

2. Namespace Organization

// PSR-4 Folder structure → Namespace mapping
//
// src/
//   Models/
//     User.php          → namespace App\Models;     class User
//     Product.php       → namespace App\Models;     class Product
//   Services/
//     UserService.php   → namespace App\Services;   class UserService
//     EmailService.php  → namespace App\Services;   class EmailService
//   Repositories/
//     UserRepository.php→ namespace App\Repositories; class UserRepository
//   Http/
//     Controllers/
//       UserController.php → namespace App\Http\Controllers; class UserController
//   Exceptions/
//     AppException.php  → namespace App\Exceptions; class AppException

// Multiple use statements
use App\Models\{User, Product, Order};         // group import
use App\Services\{UserService, EmailService};   // group import
use function App\Helpers\formatDate;            // import function
use const App\Config\APP_VERSION;              // import constant

// Full qualified name (no use needed)
$user = new \App\Models\User("Ko Ko", "ko@example.com");

3. Composer — PHP Package Manager

# Install Composer (Windows)
# Download: https://getcomposer.org/installer

# Create new project
composer init
# OR
composer create-project laravel/laravel myapp

# Install packages
composer require guzzlehttp/guzzle       # HTTP client
composer require vlucas/phpdotenv        # .env files
composer require monolog/monolog         # logging
composer require phpmailer/phpmailer     # email

# Dev dependencies (testing, debugging)
composer require --dev phpunit/phpunit
composer require --dev fakerphp/faker    # fake data

# composer.json (auto-created)
{
    "name": "myname/myapp",
    "require": {
        "php": "^8.1",
        "guzzlehttp/guzzle": "^7.0",
        "vlucas/phpdotenv": "^5.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

# Update after editing composer.json
composer dump-autoload

# Install from existing composer.json
composer install

# Update packages
composer update

4. Autoloading (PSR-4)

<?php
// Without Composer — manual require (BAD)
require_once 'src/Models/User.php';
require_once 'src/Models/Product.php';
require_once 'src/Services/UserService.php';
// ... hundreds of files!

// With Composer autoload — ONE line!
require_once 'vendor/autoload.php';
// Now ALL classes in src/ are available automatically!

use App\Models\User;
use App\Services\UserService;

$service = new UserService();
$user    = new User("Ko Ko", "ko@example.com");
// PHP automatically finds and loads the files!

// Custom autoloader (without Composer)
spl_autoload_register(function(string $className) {
    // App\Models\User → src/Models/User.php
    $path = str_replace(['App\\', '\\'], ['src/', '/'], $className) . '.php';
    if (file_exists($path)) {
        require_once $path;
    }
});
💡 Real projects: always use Composer autoloading — PSR-4 standard is followed by everyone

5. Using Third-Party Packages

<?php

require_once 'vendor/autoload.php';

// Using Guzzle HTTP client
use GuzzleHttp\Client;

$client = new Client(['base_uri' => 'https://jsonplaceholder.typicode.com']);
$response = $client->get('/users/1');
$user = json_decode($response->getBody(), true);
echo $user['name'];  // "Leanne Graham"

// Using dotenv
use Dotenv\Dotenv;

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

$dbHost = $_ENV['DB_HOST'];     // from .env file
$dbPass = $_ENV['DB_PASSWORD'];

// Using Monolog logger
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('app');
$log->pushHandler(new StreamHandler('logs/app.log', Logger::WARNING));

$log->warning("Low disk space");
$log->error("Database connection failed", ['host' => $dbHost]);

// Using Faker (dev/testing)
use Faker\Factory;

$faker = Factory::create();
echo $faker->name();        // "John Doe"
echo $faker->email();       // "ko@example.org"
echo $faker->address();     // fake address
echo $faker->phoneNumber(); // fake phone

← PHP 11  |  Next: PHP 13 → Exceptions & Error Handling →

📌 Study Checklist