Import dengan use menyembunyikan nama panjang di balik nama pendek, tetapi kadang kita justru membutuhkan alamat penuh yang tidak terpengaruh namespace maupun alias apa pun. Bentuk alamat penuh tersebut adalah fully qualified name: nama yang diawali backslash (\) sehingga pembacaannya dimulai dari namespace global. Dalam chapter ini kita akan mempelajari cara kerja nama absolut, perbedaannya dengan nama relatif, perilaku khusus ketika memanggil function global dari dalam namespace, serta konstanta ajaib __NAMESPACE__ yang melaporkan posisi kode kita saat ini.

Nama Absolut dengan Backslash Awal #

Backslash awal pada sebuah nama bekerja seperti garis miring awal pada path filesystem: /var/www/app selalu dibaca dari root, bukan dari folder saat ini. Dengan pola yang sama, \DateTimeImmutable selalu dibaca dari namespace global — tempat seluruh class bawaan PHP tinggal — apa pun namespace yang mengelilingi kode kita. Contoh berikut menunjukkan pemakaian nama absolut dari dalam namespace App\Layanan.

php
<?php
namespace App\Layanan;

$tanggal = new \DateTimeImmutable("2026-01-15 08:00:00", new \DateTimeZone("Asia/Jakarta"));
echo $tanggal->format("Y-m-d H:i:s T"), "\n";

Output yang Dihasilkan:

text
2026-01-15 08:00:00 WIB

Mari kita telaah baris-baris penting pada contoh di atas:

  1. namespace App\Layanan;: seluruh kode di bawah deklarasi ini berada di dalam namespace App\Layanan.
  2. new \DateTimeImmutable(...): backslash awal membuat interpreter mencari class secara absolut di namespace global, tempat DateTimeImmutable didefinisikan.
  3. new \DateTimeZone("Asia/Jakarta"): argumen kedua constructor juga merupakan class global; backslash awal memastikan nama tersebut tidak dibaca sebagai App\Layanan\DateTimeZone.

Nama Relatif versus Nama Absolut #

Nama yang memuat pemisah backslash tetapi tidak diawali backslash disebut qualified name, dan pembacaannya selalu relatif terhadap namespace saat ini. Tabel berikut merangkum tiga bentuk nama untuk class dari posisi namespace App:

Bentuk namaContoh dari namespace AppHasil resolusi
UnqualifiedRouterApp\Router
QualifiedAdmin\RouterApp\Admin\Router
Fully qualified\App\RouterApp\Router — absolut, tidak terpengaruh namespace saat ini

Ketiga bentuk tersebut bisa kita lihat bekerja sekaligus dalam satu berkas:

php
<?php
namespace App {
    class Router {}
}

namespace App\Admin {
    class Router {}

    $a = new Router();
    $b = new \App\Router();

    echo get_class($a), "\n";
    echo get_class($b), "\n";
}

namespace App {
    $c = new Admin\Router();

    echo get_class($c), "\n";
}

Output yang Dihasilkan:

text
App\Admin\Router
App\Router
App\Admin\Router

Berikut penjelasan hasilnya:

  1. new Router() di dalam App\Admin: nama unqualified ditambah prefix App\Admin, sehingga class yang terpilih adalah App\Admin\Router.
  2. new \App\Router(): nama fully qualified dibaca absolut, sehingga class yang terpilih adalah App\Router meskipun kode berada di App\Admin.
  3. new Admin\Router() di dalam App: nama qualified direlatifkan terhadap App, menghasilkan App\Admin\Router yang sama seperti poin pertama.

Perhatikan bahwa arti nama qualified bergantung pada posisi kode: Admin\Router dari namespace Toko akan berarti Toko\Admin\Router. Nama fully qualified tidak punya masalah semacam itu karena artinya selalu tetap di mana pun kode berada.

Memanggil Simbol Global dari Dalam Namespace #

Function bawaan PHP seperti strlen(), strtoupper(), dan count() semuanya tinggal di namespace global. PHP memberi kemudahan khusus untuk function dan constant: pemanggilan dengan nama unqualified yang tidak ditemukan di namespace saat ini akan otomatis jatuh ke namespace global. Perhatikan contoh berikut.

php
<?php
namespace App\Util;

echo strlen("Belajar PHP"), "\n";
echo \strlen("Belajar PHP"), "\n";

Output yang Dihasilkan:

text
11
11

Pada baris pertama, interpreter mencari App\Util\strlen lebih dahulu; karena tidak ada, pencarian dilanjutkan ke function global strlen dan panggilan berhasil. Baris kedua memakai bentuk absolut sehingga langsung menunjuk function global tanpa pencarian awal. Kedua baris menghasilkan nilai yang sama, sehingga untuk function bawaan yang tidak dibayangi, keduanya bisa dipakai — konsistensi gaya penulisan tim yang menentukan pilihannya.

Kapan Backslash Awal Benar-Benar Wajib #

Kemudahan fallback di atas bisa berbalik menjadi jebakan ketika namespace kita mendefinisikan simbol yang bernama sama dengan simbol global. Sekali nama lokal ditemukan, fallback tidak pernah dijalankan; satu-satunya jalan menuju versi global adalah backslash awal. Perhatikan contoh function strlen versi lokal berikut.

php
<?php
namespace App\Util {
    function strlen(string $teks): int
    {
        return 999;
    }

    echo strlen("Belajar PHP"), "\n";
    echo \strlen("Belajar PHP"), "\n";
}

Output yang Dihasilkan:

text
999
11

Pemanggilan strlen("Belajar PHP") tanpa backslash menemukan App\Util\strlen terlebih dahulu, sehingga hasilnya 999. Pemanggilan \strlen("Belajar PHP") memaksa pembacaan absolut dan mendapatkan function global yang menghitung panjang string, yaitu 11. Pola bayangan seperti ini juga terjadi ketika kita meng-import function dari package lain yang kebetulan bernama sama dengan function bawaan PHP.

Konstanta Ajaib NAMESPACE #

PHP menyediakan konstanta ajaib __NAMESPACE__ yang bernilai string nama namespace tempat baris tersebut berada. Di namespace global, konstanta ini berupa string kosong. Contoh berikut menampilkan nilainya dari tiga posisi berbeda dalam satu berkas.

php
<?php
namespace App\Models {
    echo __NAMESPACE__, "\n";
}

namespace App\Models\Aktif {
    echo __NAMESPACE__, "\n";
}

namespace {
    echo __NAMESPACE__ === "" ? "(string kosong: namespace global)" : __NAMESPACE__, "\n";
}

Output yang Dihasilkan:

text
App\Models
App\Models\Aktif
(string kosong: namespace global)

Nilai __NAMESPACE__ sering dipakai untuk membangun nama class secara dinamis, misalnya __NAMESPACE__ . "\Koneksi", atau untuk memperjelas pesan logging saat penelusuran galat. Karena berupa string biasa, konstanta ini aman dicetak dan tidak memicu efek samping apa pun. Perlu diingat bahwa nama yang dibangun secara dinamis selalu diperlakukan sebagai nama absolut — kelakuan penting ini kita bahas tuntas di chapter Namespace Resolution .

Ringkasan #

  • Nama fully qualified diawali backslash dan selalu dibaca dari namespace global.
  • Nama qualified dibaca relatif terhadap namespace saat ini; nama unqualified ditambah prefix namespace saat ini.
  • Function dan constant unqualified jatuh ke namespace global bila tidak ditemukan secara lokal; class tidak pernah mendapat fallback tersebut.
  • __NAMESPACE__ melaporkan nama namespace saat ini sebagai string, dan bernilai string kosong di namespace global.

Backslash awal memberi kepastian absolut, tetapi tetap menuntut kita menulis nama panjang di setiap baris. Kata kunci as pada chapter berikutnya menawarkan jalan tengah: nama pendek yang kita pilih sendiri, lengkap dengan kemampuan menyelesaikan konflik antar package.

Referensi #