Beyond Prefixing: Panduan Pengembang WordPress untuk PHP Namespaces
Diterbitkan: 2019-11-12Awalan semuanya.
Ini adalah pepatah yang setua perangkat lunak WordPress itu sendiri. Awalan telah menjadi standar untuk pengembang WordPress begitu lama sehingga sulit untuk membayangkan melakukan sesuatu yang berbeda. Tapi, waktunya telah tiba untuk sesuatu yang baru. Yah, itu sudah lama lewat, tetapi WordPress sedikit tertinggal dalam praktik standar di dunia PHP yang lebih besar.
Awalan adalah praktik membuat versi ramah kode dari nama proyek Anda dan menempelkannya di depan fungsi, kelas, dan hal-hal lain di namespace global. Misalnya, Anda akan memberi nama fungsi tavern_get_post() alih-alih get_post() untuk menghindari bentrokan nama fungsi, yang akan mengakibatkan kesalahan fatal.
Awalan adalah salah satu bentuk "penspasian nama", yang merupakan cara mewah untuk mengatakan bahwa nama di ruang ini milik proyek tertentu. Namun, awalan (dan akhiran, yang kurang umum) adalah peretasan dari saat tidak ada solusi untuk bahasa PHP.
PHP 5.3 memperkenalkan metode resmi namespace, jadi standarnya telah ada selama bertahun-tahun. Karena WordPress 5.2 menaikkan persyaratan PHP minimum menjadi 5.6, inilah saatnya bagi pengembang untuk melepaskan kebiasaan lama mereka dan mengejar ketinggalan dari dunia PHP lainnya.
Namespace (Hampir) Semuanya
Penspasian nama PHP hanya mencakup item berikut.
- Kelas
- Antarmuka
- Sifat-sifat
- fungsi
- Konstanta dideklarasikan dengan kata kunci
consttetapi tidakdefine()
Saat membahas pegangan skrip, nama ukuran gambar, opsi basis data, dan item lain di ruang nama global, Anda masih harus mengawalinya. Itu adalah ID dan di luar cakupan namespace PHP.
Cara Membuat Namespace
Namespace mudah untuk dideklarasikan. Di bagian atas file PHP yang ingin Anda gunakan namespace tertentu, nyatakan seperti yang ditunjukkan dalam cuplikan kode berikut.
<?php ruang nama Tavern;
Apa yang dilakukan baris kode ini adalah menyatakan bahwa segala sesuatu di dalam file khusus ini memiliki namespace Tavern .
Lihatlah fungsi sederhana di bawah namespace itu untuk mengeluarkan Hello, World! pesan.
<?php
ruang nama Tavern;
fungsi halo() {
_e( 'Halo, Dunia!', 'domain-contoh-teks' );
} Jika mengikuti aturan awalan yang lama, hello() akan diberi nama tavern_hello() . Namun, tidak demikian halnya dengan ruang nama. Fungsi hello() dienkapsulasi dalam namespace Tavern dan tidak akan bertentangan dengan fungsi lain yang bernama hello() .
Kelas dan antarmuka bekerja sama seperti fungsi. Dengan nama kelas Article , file kelas mungkin terlihat seperti berikut ini.
<?php
ruang nama Tavern;
kelas Pasal {
// ...
}Catatan: Seharusnya hanya ada satu kelas atau antarmuka per file. Ini sangat penting jika Anda berencana menggunakan autoloader.
Bagaimana Menamai Namespace
Pengembang suka berdebat tentang cara memberi nama sesuatu, dan tidak ada solusi satu ukuran untuk semua. Aturan yang paling penting adalah menjadi unik untuk menghindari bentrokan dengan kode dari proyek lain. Salah satu cara terbaik untuk melakukannya adalah dengan menggunakan namespace Vendor tingkat atas dengan sub-namespace Package .
Misalkan namespace vendor adalah Tavern dan proyek yang dimaksud adalah tema WordPress bernama News . Namespace untuk proyek mungkin terlihat seperti berikut ini.
<?php namespace Tavern\News;
Itu mungkin agak bertele-tele untuk beberapa pengembang. Jika nama proyek Anda sudah cukup unik, seperti "Awesomesauce", Anda mungkin hanya ingin menggunakan yang berikut ini.
<?php namespace Awesomesauce;
Anda akan ingin membuat semacam konvensi standar, paling tidak, untuk diri Anda sendiri. Akhirnya, Anda akan ingin masuk ke hal-hal seperti pemuatan otomatis, jadi memiliki sistem yang Anda ikuti di semua proyek Anda akan membantu. Jangan ragu untuk membaca dengan teliti standar PHP-FIG Autoloader.
Mengimpor Kelas dan Fungsi ke dalam Namespace yang Berbeda
Saat Anda perlu menggunakan kelas atau fungsi dari namespace yang berbeda dari namespace saat ini, Anda perlu mengimpornya. Ini dilakukan melalui kata kunci use di PHP.

Pernyataan use harus muncul setelah deklarasi namespace . Itu juga harus merujuk nama kelas yang sepenuhnya memenuhi syarat. Kode berikut mengimpor kelas Tavern\Helpers\Post ke dalam file dengan namespace yang berbeda.
<?php namespace Tavern\Template; gunakan Tavern\Helpers\Post;
Setelah diimpor, Anda aman untuk menggunakan kelas Post secara langsung seperti yang ditunjukkan pada cuplikan berikutnya.
$posting = Postingan baru();
Pada PHP 5.6, Anda juga dapat mengimpor fungsi dan konstanta dari ruang nama lain menggunakan use function dan use const , masing-masing. Blok kode berikut menunjukkan cara mengimpor fungsi dan konstanta.
<?php namespace Tavern\Template; gunakan fungsi Tavern\Helpers\func_name; gunakan const Tavern\Helpers\CONSTANT_NAME;
Kelas dan Fungsi Aliasing
Akhirnya, Anda akan mengalami situasi di mana Anda perlu mengimpor kelas atau fungsi yang memiliki nama yang sama dengan kelas atau fungsi dalam namespace saat ini. Anda mungkin berpikir bahwa ini adalah masalah yang harus dipecahkan oleh namespaces. Untungnya, PHP menyediakan metode untuk membuat alias saat impor.
Misalkan Anda memiliki kelas bernama Tavern\User dan perlu mengimplementasikan antarmuka Tavern\Contracts\User . Saat mengimpor antarmuka, Anda harus membuat alias seperti yang ditunjukkan di bawah ini.
<?php
ruang nama Tavern;
gunakan Tavern\Contracts\User sebagai UserContract;
class User mengimplementasikan UserContract {
// ...
} as UserContract yang ditambahkan ke akhir pernyataan use membuat alias untuk antarmuka User . Anda dapat dengan aman menggunakan nama UserContract baru tanpa kesalahan.
Kelas, antarmuka, fungsi, dan konstanta semuanya mengikuti metode yang sama untuk membuat alias.
Mengatur Struktur Folder Berdasarkan Namespaces
Ini adalah praktik standar di dunia PHP yang lebih luas untuk ruang nama dan struktur file dan folder proyek untuk dicocokkan. Melakukan hal ini memudahkan pengembang lain untuk dengan mudah menemukan kode dalam proyek Anda. Ini juga memudahkan pembuatan autoloader untuk memuat kelas sesuai permintaan.
Umumnya, semua kode PHP harus masuk ke /src , /inc , atau folder bernama serupa di proyek Anda. Contoh file plugin dan struktur folder mungkin terlihat seperti berikut ini.
/nama-plugin
/src
/Inti
/Aktifkan.php
/Setup.php
/Melihat
/Post.php
/Halaman.php Jika mengikuti struktur yang sama dengan ruang nama, file .php di atas akan berisi kelas-kelas berikut.
-
Tavern\Core\Activate -
Tavern\Core\Setup -
Tavern\View\Post -
Tavern\View\Page
Perhatikan bahwa nama file dan folder peka terhadap huruf besar-kecil dan harus sama persis dengan namespace dan nama kelas.
Tentu saja, Anda bebas mengikuti konvensi apa pun yang Anda inginkan. Namun, rekomendasi sebelumnya adalah praktik yang baik dan akan menyederhanakan cara Anda mengatur proyek Anda dalam jangka panjang.
Manfaat Menggunakan Namespace
Manfaat yang paling jelas adalah untuk menghindari bentrokan antara kelas dan fungsi dengan nama yang sama. Anda harus menggunakan ruang nama asli untuk alasan yang sama seperti Anda menggunakan awalan.
Ruang nama membantu menghindari nama kelas yang panjang. Mengetik nama panjang di seluruh proyek besar adalah praktik yang paling membosankan.
Lebih mudah beralih implementasi dengan mengimpor. Setelah Anda terbiasa mengimpor kelas dan antarmuka dari ruang nama lain, Anda dapat mengganti implementasi antarmuka dengan satu baris kode.
Pemuatan otomatis kelas jauh lebih mudah jika Anda mengikuti standar PSR-4: Pemuat otomatis, yang membutuhkan setidaknya ruang nama tingkat atas.
Untuk pengembang di ruang profesional, Anda akan mendapatkan keterampilan yang dapat dipasarkan di luar ekosistem WordPress. Anda akan kesulitan menemukan pekerjaan pengembangan PHP jika Anda tidak tahu cara menggunakan ruang nama. Ini bukan konsep yang sulit untuk dipahami, tetapi mungkin ada kurva pembelajaran bagi beberapa orang dalam praktiknya.
