oopnamespaceautoloadMahir3 mnt baca

Namespace di PHP

Hindari bentrok nama class dengan namespace dan pahami cara kerja use.

Analogi: Kode Pos

Di Indonesia ada banyak "Jalan Mawar": di Jakarta, Bandung, Surabaya. Tanpa kode pos, suratmu nyasar. Namespace adalah "kode pos" untuk class: App\Siswa dan Vendor\Siswa adalah dua class berbeda yang hidup damai berdampingan. Tanpa namespace, dua library dengan class bernama sama langsung tabrakan fatal.

php
<?php
// Contoh 1: dua class bernama sama, hidup berdampingan
// File: src/Siswa.php
namespace App;
class Siswa { public string $asal = "App"; }

// File: vendor/lain/Siswa.php
namespace Vendor\Lain;
class Siswa { public string $asal = "Vendor"; }

// File: index.php
require "vendor/autoload.php";

use App\Siswa;                    // impor versi App
use Vendor\Lain\Siswa as SiswaVendor;  // alias agar tidak bentrok

$a = new Siswa();                 // App\Siswa
$b = new SiswaVendor();           // Vendor\Lain\Siswa
echo $a->asal . " vs " . $b->asal;

use ... as ... (alias) menyelesaikan bentrok impor: dua namespace berbeda, satu nama pendek. Tanpa alias, PHP error "Cannot use ... because the name is already in use".

php
<?php
// Contoh 2: namespace bertingkat + fungsi global
namespace App\Kasir;

class Struk {
    public function cetak(): string {
        // strlen tanpa backslash: dicari dulu di App\Kasir\strlen (tidak ada),
        // lalu fallback ke global \strlen
        return "Panjang: " . strlen("kopi");
    }

    public function waktu(): string {
        // Untuk class, WAJIB backslash atau use agar tidak dicari di namespace lokal!
        $now = new \DateTime();           // global DateTime
        return $now->format("H:i");
    }
}

Aturan penting: fungsi yang tidak ditemukan di namespace lokal otomatis fallback ke global, tapi class tidak! new DateTime() di dalam namespace App; mencari App\DateTime dan fatal error. Selalu new \DateTime() atau use DateTime; di atas file.

Jebakan yang Sering Terjadi

Lupa namespace harus baris pertama. Deklarasi namespace wajib tepat setelah <?php (hanya declare boleh mendahului). Kode apa pun sebelumnya = fatal error. Gejala umum saat menempel kode contoh ke file ber-namespace.

Satu file, banyak namespace. Bisa dengan sintaks kurung kurawal, tapi sangat tidak disarankan: satu class per file adalah standar PSR-4. File multi-namespace membingungkan autoloader dan manusia.

Struktur Project Nyata

Struktur namespace standar project PHP modern (misalnya package Composer):

text
src/
  Http/
    Controller/
      ProdukController.php   -> App\Http\Controller\ProdukController
  Model/
    Produk.php               -> App\Model\Produk
  Service/
    KeranjangService.php     -> App\Service\KeranjangService
tests/
  ProdukTest.php             -> Tests\ProdukTest

Aturan: satu namespace = satu area tanggung jawab (Http untuk web, Model untuk data, Service untuk logika bisnis). Class mudah ditemukan dari namanya saja. Di composer.json, daftarkan dua prefix: "App\\": "src/" dan "Tests\\": "tests/".

Catatan teknis: Namespace tidak ada hubungannya dengan folder secara bahasa (PHP tidak peduli file di mana), tapi PSR-4 menghubungkannya secara konvensi agar autoload otomatis. Hormati konvensi itu dan autoload "berfungsi begitu saja".

Tantangan

Perbaiki class tanpa namespace

Diberi file src/Logger.php berisi class Logger {} tanpa namespace yang bentrok dengan Vendor\Logger dari package. Tambahkan namespace App; dan tulis kode index.php yang memakai keduanya sekaligus dengan alias.