Import standar memakai nama pendek bawaan, yaitu segmen terakhir dari nama lengkap sebuah simbol. Kadang nama pendek tersebut belum tentu nyaman: terlalu panjang, bertabrakan dengan nama lain, atau tidak sesuai kosakata tim. Kata kunci as pada statement use memungkinkan kita memilih nama pendek sendiri — inilah yang disebut alias. Chapter ini membahas alias untuk class, function, constant, alias pada level namespace, serta peran alias dalam menyelesaikan konflik nama antar package.

Alias untuk Class dengan as #

Bentuk lengkapnya adalah use App\Models\Pengguna as User; — setelah baris tersebut, nama User merujuk ke class App\Models\Pengguna di seluruh sisa berkas. Alias seperti ini lazim dipakai agar kode mengikuti kosakata tim, misalnya tim yang menyebut entitas pengguna sebagai User sementara kode library menyimpannya sebagai Pengguna.

php
<?php
namespace App\Models {
    class Pengguna
    {
        public static function label(): string
        {
            return "Objek Pengguna dari " . __NAMESPACE__;
        }
    }
}

namespace Aplikasi {
    use App\Models\Pengguna as User;

    echo User::label(), "\n";
    echo User::class, "\n";
}

Output yang Dihasilkan:

text
Objek Pengguna dari App\Models
App\Models\Pengguna

Mari kita telaah contoh di atas:

  1. use App\Models\Pengguna as User;: mendaftarkan User sebagai nama lokal pengganti nama pendek bawaan Pengguna.
  2. User::label(): pemanggilan berjalan seperti biasa; alias hanya menggantikan cara kita menulis namanya.
  3. User::class: hasilnya tetap App\Models\Pengguna — bukti bahwa alias tidak pernah mengubah identitas asli class.

Alias untuk Function dan Constant #

Kata kunci as juga bekerja untuk function dan constant dengan tetap memakai pendamping use function dan use const. Pola ini berguna ketika nama function library panjang sedangkan kode aplikasi menyebutnya dengan istilah domain yang lebih pendek.

php
<?php
namespace App\Util {
    const TARIF_PPN = 0.11;

    function hitungPajak(float $harga): float
    {
        return $harga * TARIF_PPN;
    }
}

namespace Aplikasi {
    use function App\Util\hitungPajak as pajak;
    use const App\Util\TARIF_PPN as PPN;

    echo pajak(200000), "\n";
    echo PPN, "\n";
}

Output yang Dihasilkan:

text
22000
0.11

Pada contoh di atas, hitungPajak diimport sebagai pajak dan constant TARIF_PPN sebagai PPN. Pemanggilan pajak(200000) menjalankan function asli di App\Util dan menghasilkan 22000, sedangkan PPN mencetak nilai 0.11 langsung dari constant aslinya. Satu function dan satu constant kini punya nama pendek yang seragam dengan gaya penulisan aplikasi.

Memendekkan Namespace yang Dalam #

Package modern sering memakai namespace bertingkat dalam, misalnya Symfony\Component\HttpFoundation. Alih-alih meng-import class satu per satu, kita bisa memberi alias pada prefix namespace-nya, lalu menyusun nama class di belakang alias tersebut. Satu alias dengan demikian menggantikan banyak baris use.

php
<?php
namespace Toko\Invoice\Domain\Entity {
    class Tagihan {}

    class Pelanggan {}
}

namespace Aplikasi {
    use Toko\Invoice\Domain\Entity as Entity;

    $tagihan = new Entity\Tagihan();
    $pelanggan = new Entity\Pelanggan();

    echo get_class($tagihan), "\n";
    echo get_class($pelanggan), "\n";
}

Output yang Dihasilkan:

text
Toko\Invoice\Domain\Entity\Tagihan
Toko\Invoice\Domain\Entity\Pelanggan

Berikut penjelasan cara kerjanya:

  1. use Toko\Invoice\Domain\Entity as Entity;: mendaftarkan Entity sebagai alias untuk prefix namespace Toko\Invoice\Domain\Entity.
  2. new Entity\Tagihan(): nama Entity\Tagihan diterjemahkan menjadi Toko\Invoice\Domain\Entity\Tagihan — terlihat jelas pada hasil get_class().
  3. new Entity\Pelanggan(): class kedua dari namespace yang sama bisa dipakai tanpa menambah baris import baru.

Menyelesaikan Konflik Nama #

Masalah klasik proyek besar: dua package berbeda sama-sama mendefinisikan class bernama Log. Import standar hanya mengizinkan satu nama pendek Log, sehingga salah satu harus rela berganti nama lewat alias. Dengan as, kedua class hidup berdampingan dalam satu berkas tanpa bentrok.

php
<?php
namespace App\Logging {
    class Log
    {
        public static function sumber(): string
        {
            return "Log internal aplikasi";
        }
    }
}

namespace Vendor\Monitor {
    class Log
    {
        public static function sumber(): string
        {
            return "Log dari package vendor";
        }
    }
}

namespace Aplikasi {
    use App\Logging\Log;
    use Vendor\Monitor\Log as MonitorLog;

    echo Log::sumber(), "\n";
    echo MonitorLog::sumber(), "\n";
}

Output yang Dihasilkan:

text
Log internal aplikasi
Log dari package vendor

Baris use App\Logging\Log; memakai nama pendek bawaan Log, sedangkan use Vendor\Monitor\Log as MonitorLog; memindahkan class vendor ke nama MonitorLog. Sebaliknya, jika kedua import sama-sama memperebutkan satu nama pendek, PHP menolak sejak kompilasi:

php
<?php
namespace Aplikasi;

use App\Logging\Log;
use Vendor\Monitor\Log;

echo "Tidak pernah tereksekusi";

Output yang Dihasilkan:

text

Fatal error: Cannot use Vendor\Monitor\Log as Log because the name is already in use in /home/z/my-project/php-course/content/php/namespaces-dan-autoloading/namespace-aliases/.verify_tmp.php on line 5

Pesan Cannot use Vendor\Monitor\Log as Log because the name is already in use muncul sebelum satu baris pun dieksekusi. PHP membatasi satu nama pendek untuk satu simbol per berkas, jadi konflik selalu harus diselesaikan — pindahkan salah satu ke alias lain. Galat ini bersifat fatal dan menghentikan skrip dengan exit code 255.

Alias di dalam Group Use #

Group use yang kita pelajari di chapter Namespace Imports juga menerima alias untuk setiap anggotanya. Kombinasi ini memungkinkan beberapa class dari satu namespace diimport sekaligus dengan nama pendek pilihan kita masing-masing.

php
<?php
namespace App\Models {
    class Pengguna {}
    class Pesanan {}
}

namespace Aplikasi {
    use App\Models\{Pengguna as User, Pesanan as Order};

    echo User::class, "\n";
    echo Order::class, "\n";
}

Output yang Dihasilkan:

text
App\Models\Pengguna
App\Models\Pesanan

Pada statement tunggal di atas, Pengguna menjadi User dan Pesanan menjadi Order. Hasil ::class membuktikan kedua alias tetap menunjuk ke nama lengkap aslinya di App\Models. Bentuk seperti ini sering dipakai ketika aplikasi memakai istilah bahasa Inggris sementara domain model ditulis dengan nama lokal, atau sebaliknya.

Ringkasan #

  • use Nama\Panjang as Pendek; memberi nama pendek pilihan kita sendiri untuk class, function, dan constant.
  • Alias bisa diberikan pada prefix namespace sehingga satu baris use menyingkat banyak class.
  • Konflik dua class bernama sama diselesaikan dengan memindahkan salah satunya ke alias berbeda; nama pendek ganda ditolak fatal sejak kompilasi.
  • Alias tidak mengubah identitas asli — ::class dan get_class() tetap menampilkan nama lengkap yang asli.

Alias memberi kita kendali penuh atas penulisan nama. Pertanyaan berikutnya lebih mendasar: bagaimana persisnya interpreter menerjemahkan setiap bentuk nama — unqualified, qualified, maupun fully qualified — ketika tidak ada import maupun alias yang membantu? Aturan resolusi lengkapnya menjadi pokok bahasan chapter Namespace Resolution.

Referensi #