DevTips – Namespace di PHP

Diterbitkan: 2020-03-06

Sekitar setahun yang lalu WordPress memutuskan untuk memperbarui versi PHP minimum yang diperlukan, dari 5.2 (digunakan sejak 2010) menjadi sesuatu yang lebih mutakhir. Faktanya, Hari ini versi minimum PHP yang direkomendasikan oleh WordPress adalah salah satu yang terbaru: PHP 7.3.

Jika Anda adalah pengguna WordPress yang sederhana, ini mungkin tidak akan terlalu memengaruhi Anda (selain fakta bahwa versi baru ini memberikan kinerja yang lebih baik).

Tetapi jika Anda seorang pengembang, versi PHP baru ini memiliki beberapa fitur luar biasa yang dapat Anda gunakan di plugin dan tema Anda. Dan hari ini, secara khusus, saya ingin berbicara dengan Anda tentang satu yang telah lama bersama kami tetapi: ruang nama.

WordPress dan awalan kode

Salah satu aturan pertama yang Anda pelajari sebagai pengembang WordPress adalah "menggunakan awalan dalam semua yang kami lakukan" untuk menghindari "tabrakan nama". Seperti yang dapat kita baca di praktik terbaik WordPress:

Tabrakan penamaan terjadi ketika plugin Anda menggunakan nama yang sama untuk variabel, fungsi, atau kelas sebagai plugin lain.

[Untuk menghindari tabrakan nama], semua variabel, fungsi, dan kelas harus diawali dengan pengenal unik. Prefiks mencegah plugin lain menimpa variabel Anda dan secara tidak sengaja memanggil fungsi dan kelas Anda. Ini juga akan mencegah Anda melakukan hal yang sama.

Praktik terbaik untuk mengembangkan plugin WordPress

Jadi, misalnya, daripada membuat fungsi seperti get_site_id , lebih baik nelio_content_get_site_id . Dengan cara ini, kami dapat dengan cepat mengidentifikasi plugin ( nelio_content ) atau tema yang memiliki fungsi tertentu ( get_site_id ) dan menghindari kesalahan fatal jika beberapa plugin mencoba mendefinisikan fungsi yang sama.

Menggunakan awalan adalah cara dasar untuk membuat "namespace"; solusi yang harus kami terapkan saat kami tidak memiliki alternatif yang lebih baik. Semua elemen yang menggunakan awalan yang sama adalah bagian dari set atau namespace yang sama. Tetapi ini menghasilkan kode yang lebih kompleks yang tidak perlu: nama lebih panjang karena awalan yang tidak memiliki tujuan selain meniru ruang nama.

Ruang Nama PHP

PHP versi 5.3 memperkenalkan konsep namespace . Definisi yang mereka berikan dalam dokumentasi tampak luar biasa bagi saya, jadi saya mereproduksinya di sini:

Dalam ruang nama definisi terluas adalah cara untuk mengenkapsulasi item. Ini dapat dilihat sebagai konsep abstrak di banyak tempat. Misalnya, di direktori sistem operasi apa pun berfungsi untuk mengelompokkan file terkait, dan bertindak sebagai ruang nama untuk file di dalamnya. Sebagai contoh nyata, 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.

Di dunia PHP, ruang nama dirancang untuk memecahkan dua masalah yang dihadapi oleh penulis perpustakaan dan aplikasi saat membuat elemen kode yang dapat digunakan kembali seperti kelas atau fungsi:

1. Beri nama tabrakan antara kode yang Anda buat, dan kode PHP internal atau kode pihak ketiga.

2. Kemampuan untuk alias (atau mempersingkat) Extra_Long_Names , meningkatkan keterbacaan kode sumber.

dokumen PHP

Cara membuat ruang nama

Membuat namespace di PHP sangat mudah. Di awal file PHP yang Anda buat, tambahkan direktif namespace dengan nama yang ingin Anda gunakan dan "semua" yang Anda tentukan dalam file itu akan menjadi milik namespace itu:

 <?php namespace Nelio_Content;

Ya, sesederhana itu! Sekarang "semua" yang kita buat akan ada di namespace Nelio_Content . Misalnya, jika saya mendefinisikan fungsi seperti yang saya sebutkan di awal:

 <?php namespace Nelio_Content; function get_site_id() { // ... }

kita sekarang tahu bahwa get_site_id ada di dalam namespace Nelio_Content . Dengan cara ini, kita tidak lagi harus menggunakan awalan nelio_content_ saat mendefinisikan fungsi. Besar!

Pengecualian Untuk Namespace

Jika Anda melihat lebih dekat pada apa yang telah saya katakan sejauh ini, Anda akan melihat bahwa saya telah menulis "semuanya" dalam tanda kutip: "'semuanya' yang kami tambahkan di sana akan menjadi milik namespace yang ditentukan." Mengapa saya melakukan itu? Karena ruang nama tidak berlaku untuk semua kode yang kita tulis… ada beberapa pengecualian.

Ruang nama PHP hanya mencakup elemen PHP berikut:

  • Kelas
  • Antarmuka
  • Sifat-sifat
  • Fungsi
  • Konstanta dideklarasikan dengan const tetapi tidak dengan define

Selain itu, ada beberapa hal tambahan di WordPress yang juga membutuhkan ruang nama mereka sendiri dan, sayangnya, ruang nama PHP tidak mencakup: pegangan skrip Anda, opsi basis data, atau jenis konten khusus dan metadatanya, dll. Dalam semua kasus ini, Anda harus terus menggunakan awalan.

Cara Mengimpor Elemen Dari Satu Namespace Ke Yang Lain

Jika Anda perlu menggunakan elemen yang ada di namespace Anda sendiri, Anda tidak perlu melakukan sesuatu yang istimewa: panggil saja dengan namanya. Misalnya, dalam cuplikan kode berikut:

 <?php namespace Nelio_Content; function get_site_id() { // ... } function get_auth_token() { $site_id = get_site_id(); // ... }

Anda dapat melihat bahwa kami telah mendefinisikan dua fungsi: get_site_id dan get_auth_token , keduanya dalam namespace Nelio_Content . Ketika get_auth_token perlu menggunakan get_site_id , itu hanya menyebutnya seperti biasa.

Sebaliknya, jika Anda perlu menggunakan get_site_id di namespace yang berbeda, Anda harus memanggil fungsi tersebut menggunakan pengenal lengkapnya:

 <?php namespace Something_Else; function do_some_action() { $site_id = Nelio_Content\get_site_id(); // ... }

atau Anda harus mengimpor fungsi dengan kata kunci use :

 <?php namespace Something_Else; use Nelio_Content\get_site_id; function do_some_action() { $site_id = get_site_id(); // ... }

Saya pribadi sangat menyukai opsi kedua: menggunakan kata kunci yang use untuk mengimpor fungsi dari ruang nama lain, Anda dapat melihat sekilas header file Anda dan mengidentifikasi dependensinya.

Filter dan Tindakan WordPress Dengan Ruang Nama PHP

Ada detail penting yang harus Anda ingat saat menggunakan ruang nama di sebelah filter dan tindakan WordPress. Saat Anda menentukan filter dan panggilan balik tindakan, biasanya Anda melakukannya dengan memberikan nama panggilan balik sebagai string:

 <?php // ... add_action( 'init', 'do_some_action' );

Masalahnya adalah jika fungsi ini berada di dalam namespace, hook sebelumnya tidak akan berfungsi seperti yang diharapkan; Anda harus memberi tahu WordPress nama lengkap fungsinya. Dengan kata lain, Anda harus menyertakan namespace-nya (jika ada).

Apakah Anda menambahkan kait di file tempat Anda mendefinisikan namespace itu sendiri? Tidak masalah, gunakan nama lengkap:

 <?php namespace Nelio_Content; function do_some_action() { // ... } add_action( 'init', 'Nelio_Content\do_some_action' );

Apakah Anda berada di namespace lain tetapi Anda mengimpor fungsi dengan use ? Tidak masalah juga, gunakan nama lengkap:

 <?php namespace Something_Else; use Nelio_Content\do_some_action; // ... add_action( 'init', 'Nelio_Content\do_some_action' );

Menggunakan Alias ​​​​Dengan Ruang Nama Kami

Fungsi lain yang sangat menarik dari namespace adalah aliasing. Bayangkan skenario berikut:

 <?php namespace Nelio_Content; function get_site_id() { // ... }

Jika saya ingin menggunakan fungsi ini di namespace lain, kami telah melihat bahwa saya dapat melakukannya dengan use . Tetapi bagaimana saya akan menggunakan fungsi ini jika modul yang ingin saya gunakan sudah memiliki fungsi yang disebut get_site_id ?

Nah, untungnya bagi saya, kita bisa alias impor kita ke nama baru:

 <?php namespace Something_Else; use Nelio_Content\get_site_id as get_nc_site_id(); function get_site_id() { // ... } function do_some_action() { $nc_site_idd = get_nc_site_id(); // ... }

Mulai Gunakan Namespace Sekarang!

Namespaces adalah alat yang fantastis untuk menghindari tabrakan nama dan untuk mengatur kode kita. Faktanya, dan meskipun saya belum mengomentari posting ini, ada standar seperti PSR-4 yang memungkinkan PHP untuk memuat kelas secara otomatis berdasarkan struktur ruang nama yang Anda gunakan dan bagaimana Anda mengatur kode ke dalam direktori dan file.

Jika Anda belum menggunakan ruang nama dalam proyek Anda, kami sarankan Anda mulai melakukannya mulai sekarang. Beritahu kami tentang pengalaman Anda di komentar!

Gambar unggulan oleh Chaitanya Tvs di Unsplash.