Menu

Namespace PHP: namespace, use, dan Alias

Namespace PHP mengelompokkan class, fungsi, dan konstanta di bawah sebuah prefix: namespace App\Models; di bagian atas file, lalu use App\Models\User; di tempat lain untuk merujuk class itu dengan nama pendeknya. Pelajari fully qualified name, alias use ... as, use function, backslash di depan untuk class global, dan autoloading PSR-4.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Namespace PHP menempatkan class, fungsi, dan konstanta di bawah sebuah prefix agar namanya tidak bisa bentrok dengan milik orang lain. Kamu mendeklarasikannya dengan namespace App\Models; sebagai pernyataan pertama sebuah file, lalu file lain merujuk class itu sebagai \App\Models\User, atau meng-import-nya dengan use App\Models\User; dan cukup menulis User.

Di dalam namespace, User berarti App\Models\User. User::class memberi nama lengkapnya sebagai string tanpa membuat apa pun, yang berguna untuk logging dan untuk autoloader.

Dua namespace dalam satu file

Proyek sungguhan menaruh satu namespace di setiap file. Untuk demo yang berdiri sendiri, satu file boleh berisi beberapa namespace jika masing-masing dibungkus kurung kurawal. Kode yang tidak termasuk namespace mana pun ditaruh di namespace { }:

Dua class bernama Order bisa berdampingan karena nama lengkapnya berbeda. Itulah tepatnya masalah yang diselesaikan namespace begitu kamu memasang library: Order milikmu, Order milik library pembayaran, dan Order milik library PDF tidak lagi bentrok.

Import dengan use, dan alias dengan as

Menulis \Shop\Order di mana-mana terasa berisik. use di bagian atas file (atau blok namespace) meng-import sebuah nama agar kamu bisa memakai bentuk pendeknya. Saat dua import akan berakhir dengan nama pendek yang sama, as memberi salah satunya nama yang berbeda:

use hanya membuat nama pendek untuk sisa file. Pernyataan ini tidak memuat file atau menjalankan kode, dan bekerja dengan cara yang sama entah class-nya sudah ada atau belum. Import berkelompok juga diperbolehkan: use Shop\{Order, Invoice};.

use function dan use const

Fungsi dan konstanta di dalam namespace di-import dengan use function dan use const:

Class global butuh backslash

Di dalam namespace, nama class tanpa prefix diselesaikan relatif terhadap namespace itu, jadi new DateTime() di dalam namespace App; mencari App\DateTime. Fungsi dan konstanta berbeda: jika App\strlen tidak ada, PHP kembali ke strlen global. Class tidak pernah kembali ke global.

catch (\Error $e) juga butuh backslash karena alasan yang sama: tanpanya PHP akan mencari App\Error, tidak pernah cocok dengan error yang sebenarnya, dan script berhenti dengan Error yang tidak tertangkap. Perbaiki dengan backslash di depan, seperti di atas, atau dengan use DateTime; di bagian atas file. Hal yang sama berlaku untuk \Exception, \Throwable, dan setiap class bawaan lainnya; lihat try catch untuk cara menangkapnya.

Autoloading dan PSR-4

Di sebuah proyek, setiap class berada di file-nya sendiri, dan path file-nya mengikuti namespace. PSR-4 adalah konvensinya: prefix namespace dipetakan ke folder dasar, dan sisa namanya menjadi path. Autoloader yang didaftarkan dengan spl_autoload_register() lalu memuat file class pada saat class itu pertama kali dipakai. Blok ini menulis dua file class ke disk lalu memuatnya secara otomatis:

Setiap file class dimuat sekali, tepat saat class itu pertama kali dibutuhkan. Di proyek sungguhan, kamu tidak menulis fungsi ini sendiri: Composer membuatnya dari beberapa baris di composer.json:

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

Setelah composer dump-autoload, satu baris require __DIR__ . '/vendor/autoload.php'; di awal script utamamu memuat setiap class App\... saat dibutuhkan.

Aturan namespace yang menyebabkan error

  • namespace harus menjadi pernyataan pertama di file. Hanya declare(strict_types=1); dan komentar yang boleh ada sebelumnya.
  • Import use berlaku per file. Meng-import class di index.php tidak membuat nama pendeknya berfungsi di file yang di-include; setiap file butuh baris use-nya sendiri.
  • use ditulis di level teratas file atau blok namespace. Di dalam body class, use punya arti lain: memasukkan sebuah trait.
  • String tidak pernah diselesaikan: $class = 'User'; new $class(); mencari User global. Simpan nama lengkapnya, sebaiknya dengan User::class.

Aturan terakhir layak dicek dengan cepat:

Pertanyaan yang sering diajukan

Apa itu namespace di PHP?

Prefix yang mengelompokkan class, interface, fungsi, dan konstanta yang saling berkaitan, seperti folder untuk nama. namespace App\Models; di bagian atas file menempatkan class User miliknya di App\Models\User, sehingga tidak bisa bentrok dengan User milik library lain.

Apa fungsi use di PHP?

use App\Models\User; di bagian atas file memungkinkanmu menulis User alih-alih nama lengkap \App\Models\User di file itu. Pernyataan ini tidak memuat atau meng-include apa pun; memuat file class adalah tugas autoloader. use ... as Alias; memilih nama pendek yang berbeda.

Kenapa saya mendapat Class not found di dalam namespace?

Di dalam namespace App;, nama class tanpa prefix diselesaikan relatif terhadap namespace, jadi new DateTime() mencari App\DateTime. Tulis new \DateTime() atau tambahkan use DateTime; di bagian atas. Fungsi dan konstanta otomatis kembali ke namespace global, class tidak.

Apa arti backslash sebelum nama class di PHP?

Backslash di depan membuat nama itu menjadi fully qualified, dimulai dari namespace global: \Exception selalu berarti Exception bawaan PHP, apa pun namespace tempat kodenya berada. Tanpa backslash, nama itu diselesaikan relatif terhadap namespace saat ini dan import dari use.

Apa hubungan namespace dengan folder dan PSR-4?

PHP sendiri tidak mengikat namespace dengan folder. PSR-4 adalah konvensi yang melakukannya: prefix seperti App\ dipetakan ke direktori seperti src/, jadi App\Models\User berada di src/Models/User.php. Autoloader Composer mengikuti konvensi itu, itulah sebabnya keduanya biasanya cocok.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai