Namespace dalam PHP
Namespace adalah fitur PHP yang memungkinkan kita mengorganisir kode dengan mengelompokkan class, interface, fungsi, dan konstanta untuk menghindari konflik nama.
Apa itu Namespace?
Namespace adalah cara untuk mengelompokkan kode-kode yang berhubungan dalam satu ruang nama (namespace) untuk menghindari konflik nama.
Masalah Tanpa Namespace
Bayangkan Anda memiliki dua class dengan nama User
- satu untuk sistem autentikasi dan satu untuk manajemen user. Tanpa namespace, PHP akan mengalami konflik nama.
❌ Tanpa Namespace
<?php
// File: Auth/User.php
class User {
public function login() {}
}
// File: Admin/User.php
class User { // Fatal error!
public function manage() {}
}
✅ Dengan Namespace
<?php
// File: Auth/User.php
namespace Auth;
class User {
public function login() {}
}
// File: Admin/User.php
namespace Admin;
class User {
public function manage() {}
}
Mendefinisikan Namespace
Sintaks Dasar
<?php
namespace NamaNamespace;
// Kode Anda di sini
Namespace Berlapis
<?php
namespace App\Models\User;
class Profile {
public function getInfo() {
return "User profile information";
}
}
// Namespace ini setara dengan direktori: App/Models/User/
Namespace Global
<?php
// Tanpa namespace = namespace global
class GlobalClass {
// Berada di namespace global
}
namespace MyApp;
// Untuk mengakses class global dari dalam namespace
$obj = new \GlobalClass(); // Backslash di depan
Menggunakan Namespace
1. Fully Qualified Name
<?php
// File: Models/User.php
namespace Models;
class User {
public function getName() {
return "John Doe";
}
}
// File: index.php
require 'Models/User.php';
// Menggunakan fully qualified name
$user = new \Models\User();
echo $user->getName();
2. Use Statement
<?php
require 'Models/User.php';
// Import namespace
use Models\User;
// Sekarang bisa langsung menggunakan
$user = new User();
echo $user->getName();
3. Use dengan Alias
<?php
use Models\User as ModelUser;
use Auth\User as AuthUser;
$modelUser = new ModelUser();
$authUser = new AuthUser();
4. Multiple Use Statement
<?php
use Models\{User, Product, Category};
use Auth\{Login, Register, Password};
// Sekarang semua class bisa digunakan langsung
$user = new User();
$product = new Product();
$login = new Login();
Alias dan Import
Class Alias
<?php
namespace App\Controllers;
// Alias untuk class
use App\Models\User as UserModel;
use App\Services\EmailService as Email;
class UserController {
public function create() {
$user = new UserModel();
$email = new Email();
// Menggunakan alias
$email->send($user->getEmail(), "Welcome!");
}
}
Function dan Constant Import
<?php
namespace App\Helpers;
function formatCurrency($amount) {
return 'Rp ' . number_format($amount, 0, ',', '.');
}
const TAX_RATE = 0.1;
// File lain
use function App\Helpers\formatCurrency;
use const App\Helpers\TAX_RATE;
echo formatCurrency(100000); // Rp 100.000
echo TAX_RATE; // 0.1
Global Fallback
<?php
namespace MyApp;
// Menggunakan fungsi global dari dalam namespace
echo \strlen("Hello"); // Backslash untuk akses global
echo \date("Y-m-d"); // Global date function
// Atau import dulu
use function strlen, date;
echo strlen("Hello");
echo date("Y-m-d");
Autoloading dengan Namespace
PSR-4 Autoloading
<?php
// composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}
Struktur Direktori
project/
├── composer.json
├── vendor/
├── src/
│ ├── Controllers/
│ │ └── UserController.php
│ ├── Models/
│ │ └── User.php
│ └── Services/
│ └── EmailService.php
└── index.php
File dengan Namespace
<?php
// src/Controllers/UserController.php
namespace App\Controllers;
use App\Models\User;
use App\Services\EmailService;
class UserController {
private $userModel;
private $emailService;
public function __construct() {
$this->userModel = new User();
$this->emailService = new EmailService();
}
}
Menggunakan Autoload
<?php
// index.php
require 'vendor/autoload.php';
use App\Controllers\UserController;
use App\Models\User;
// Class akan di-load otomatis
$controller = new UserController();
$user = new User();
💡 Tips dan Best Practices
- 📁 Struktur Direktori: Sesuaikan struktur direktori dengan namespace untuk kemudahan autoloading
- 🎯 Naming Convention: Gunakan PascalCase untuk namespace dan sesuaikan dengan standar PSR
- 🔄 Import Selektif: Hanya import class/function yang benar-benar digunakan
- 📋 Dokumentasi: Dokumentasikan namespace yang digunakan dalam project
- 🚫 Global Namespace: Hindari penggunaan namespace global untuk project besar