Ruang Nama PHP di WordPress – Panduan Tanpa Omong kosong
Diterbitkan: 2018-10-16Ruang nama PHP hampir berumur sepuluh tahun. Ya, satu dekade telah berlalu (dan ya, Anda semakin tua). Meskipun satu dekade telah berlalu sejak PHP v5.3 dirilis, banyak pengembang masih belum memiliki pemahaman dasar tentang namespace. Sejujurnya WordPress tidak menggunakan ruang nama jadi “ Anda tidak perlu tahu cara menggunakan ruang nama jika Anda hanya bekerja dengan WordPress .” Anda tidak perlu menjadi ninja namespace, tetapi memahami dasar-dasarnya sangatlah sederhana dan bermanfaat bagi Anda.
Ruang nama PHP telah ada selama satu dekade, dan Anda masih tidak menggunakannya karena #wordpress juga tidak? Baca & mulai gunakan dalam 2 menit! #perkembangan
KLIK UNTUK TWEETKetika tidak ada dukungan namespace – gunakan awalan
Untuk waktu yang sangat lama PHP tidak memiliki dukungan namespace asli. Itu sebabnya WordPress dan banyak basis kode besar lainnya tidak menggunakan ruang nama asli. Mereka tidak ada saat dibutuhkan, jadi awalan digunakan.
Penspasian nama penting karena memastikan fungsi Anda write_to_log()
belum ditentukan oleh bagian kode lain. Untuk menghindari bentrokan nama, segala sesuatu dalam lingkup global memerlukan awalan sehingga fungsinya menjadi awesome_project_write_to_log()
dan semua fungsi dan variabel lainnya mendapatkan awalan awesome_project_
juga. Sederhana? Dia! Cantik? Tidak tepat.
Ada beberapa alternatif untuk pendekatan itu seperti enkapsulasi metode statis. Anda membungkus semua fungsi Anda di kelas dan mendeklarasikannya sebagai metode statis. Kemudian alih-alih memanggil my_function()
Anda memanggil My_Class::my_function()
. Lebih baik? Sedikit, tapi masih belum tepat namespace.
Mari kita lihat bagaimana penspasian nama memungkinkan beberapa potongan kode (atau paket jika Anda mau) menggunakan nama kelas dan fungsi yang sama tanpa konflik. Atau seperti yang dikatakan manual PHP - bagaimana mereka mengaktifkan enkapsulasi kode. Analogi mereka dengan file dan folder juga tepat – dalam banyak hal ruang nama berperilaku seperti folder, jadi saya akan menyalin/menempel dari manual;
Dalam sistem operasi apa pun, direktori berfungsi untuk mengelompokkan file terkait dan bertindak sebagai ruang nama untuk file di dalamnya. Misalnya, file foo.txt dapat berada di direktori /home/greg dan di /home/other, tetapi dua salinan foo.txt tidak dapat berada di direktori yang sama. Untuk mengakses file foo.txt di luar direktori /home/greg, kita harus menambahkan nama direktori lengkap ke nama file menggunakan pemisah direktori untuk mendapatkan /home/greg/foo.txt.
Mendeklarasikan ruang nama – ingat baris pertama
namespace
kata kunci harus menjadi baris kode pertama dalam file (tidak termasuk komentar dan konten non-PHP). Ruang nama hanya memengaruhi kelas, antarmuka, fungsi, dan konstanta. Mereka tidak mempengaruhi variabel. Anda dapat menentukan namespace yang sama di beberapa file yang memungkinkan Anda untuk membagi kode menjadi beberapa file. Sub-ruang nama memungkinkan untuk mendefinisikan hierarki di ruang nama seperti di folder dengan menggunakan garis miring terbalik – namespace myproject\level1\level2
. Itu adalah dasar dan hampir semua aturan untuk mendeklarasikan ruang nama.
// file-A.php contains a function under the myCompany\PackageA namespace namespace myCompany\PackageA; function do_something() { // do things }
// file-B.php contains a function with the same name // but under a different namespace namespace myCompany\PackageB; function do_something() { // do things }
Meskipun memungkinkan, saya sangat menyarankan untuk tidak menggabungkan beberapa ruang nama menjadi satu file. Percayalah, cepat atau lambat Anda akan lupa bahwa Anda melakukannya dan kemudian men-debug bug 2 menit membutuhkan waktu dua jam. Namun, jika Anda harus, inilah sintaksnya.

// do not put multiple namespace declarations into the same file // but if you must, here's the syntax namespace MyFirstProject { const CONST = true; class Connection { /* ... */ } function connect() { /* ... */ } } namespace MySecondProject { const CONST = true; class Connection { /* ... */ } function connect() { /* ... */ } } // any code after this has to go in the global namespace namespace { $some_var = 1; function_in_global_namespace(); }
Menggunakan ruang nama – ingat folder
Seperti yang sudah saya katakan – ruang nama sangat mirip dengan folder. Dengan asumsi file foo.txt
ada di folder Anda saat ini; Anda dapat merujuknya dengan foo.txt
sederhana. Jika Anda satu tingkat di atas folder dengan file foo.txt
maka Anda perlu menggunakan jalur relatif ../foo.txt
atau jalur absolut /folder1/folder2/foo.txt
. Tidak ada yang mewah. Namespace menggunakan paradigma yang sama.
// remember after declaring a namespace // all our code is in it; like when you're working in a folder namespace mycompany\project; function foo() {} class foo { static function staticmethod() {} } // resolves to mycompany\project\foo() because of line #3 foo(); // likewise, resolves to mycompany\project\foo::staticmethod() foo::staticmethod(); // constant are affected by namespaces too // so we're working with mycompany\project\FOO echo FOO; // this is a relative path // resolves to mycompany\project\subnamespace\foo() subnamespace\foo(); // static methods are no different // mycompany\project\subnamespace\foo::staticmethod() subnamespace\foo::staticmethod(); // a full namespace path starts with a backslash // it resolves exactly to what it says it does \otherNamespace\Bar\foo(); // again same thing for a constant, full path nothing magical echo \otherNamespace\Bar\FOO;
Lihat kata kunci use
di manual PHP – contohnya sangat bagus. Ini menyediakan cara untuk mengimpor kode dari ruang nama PHP lain ke ruang nama saat ini atau untuk merujuk ke nama eksternal (yang memenuhi syarat) dengan alias.
Ya, Anda memerlukan ruang nama & harus menggunakannya
Karena lebih dari terbukti dengan melihat sumber WordPress – Anda tidak harus menggunakan namespace, tetapi Anda harus menggunakan beberapa metode namespace. Awalan dengan wp_
dalam kasus WP. Jadi jika kita sudah melakukannya mengapa tidak melakukannya dengan benar?
Ruang nama di PHP dengan mudah diintegrasikan ke dalam alur kerja pengembangan apa pun. Mereka memudahkan autoloading, penamaan file dan secara umum membuat kode lebih bersih. Refactoring kode lama tidak pernah menjadi tugas yang populer (terlepas dari bahasa pengkodean) jadi saya tidak akan memberitahu Anda untuk melanjutkan dan refactor proyek 2 MB yang berfungsi hanya agar Anda dapat mengatakan Anda menggunakan ruang nama. Namun, saya akan memaksa Anda menggunakan ruang nama saat mengerjakan proyek baru. Anda akan segera berterima kasih pada diri sendiri.
Dokumentasi PHP resmi di ruang nama sangat luar biasa! Sampel kode bersih dan komentar sangat membantu. Pastikan untuk menelusurinya, bahkan jika Anda merasa tidak perlu melakukannya.