Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress Plugins
Code

Menggunakan Ruang Name dan Autoloading dalam Plugin WordPress, Bahagian 4

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Using Namespaces and Autoloading in WordPress Plugins.
Using Namespaces and Autoloading in WordPress Plugins, Part 3

Malay (Melayu) translation by Meyria (you can also view the original English article)

Jika ini adalah tutorial pertama yang anda baca dalam siri ini, maka saya sangat mengesyorkan menangkap apa yang telah kita tutup sejauh ini.

Pada dasarnya, anda akan masuk pada akhir pertunjukan. Pada ketika ini, kami telah meletakkan asas bagi plugin kami, menulis plugin, dan ruang nama dan autoloader yang ditakrifkan dan dijelajahi. Semua yang tersisa adalah untuk menerapkan apa yang telah kami pelajari.

Jadi dalam tutorial ini, kita akan meletakkan semua keping bersama. Khususnya, kami akan mengkaji kembali kod sumber plugin kami, ruang nama semua kelas yang berkaitan, dan menulis autoloader supaya kami dapat memadam semua penyata termasuk kami.

Saya akan membincangkan segala-galanya secara terperinci semasa kita bekerja melalui kod. Sekali lagi, jika ini adalah tutorial pertama yang anda baca dalam siri ini, dapatkan apa yang telah kita tutup sejauh ini dan kemudian kembali ke tutorial ini.

Sebelum Kami Menulis Sebarang Kod

Pada ketika ini, anda perlu tahu bagaimana kami menyediakan persekitaran pembangunan kami. Sebagai penyegar, inilah ringkasan ringkas mengenai perisian yang kami gunakan:

  • sekurang-kurangnya PHP 5.6.20
  • pelayan web Apache
  • pelayan pangkalan data MySQL
  • WordPress 4.6.1
  • pengetahuan kerja API Plugin WordPress

Anda juga akan memerlukan salinan kod sumber plugin yang kami gunakan. Anda boleh ambil salinan benarnya di sini. Dengan asumsi ia dipasang, diaktifkan, dan anda telah mendapat IDE anda berjalan, mari bermula.

Namespacing the Code

Ingat dari tutorial sebelumnya, saya peminat memastikan ruang nama kami mengikut organisasi fail pada cakera. Jika anda melihat struktur direktori plugin kami atau jika anda telah mengikuti bersama dengan siri setakat ini, anda harus melihat sesuatu seperti ini:

The directory structure of our plugin

Perhatikan bahawa jika anda telah menyediakan plugin anda dengan cara yang berbeza, tak mengapa. Ruang nama anda mungkin berbeza, tetapi itu tidak akan mempengaruhi apa-apa yang diliputi dalam siri ini.

Menggunakan struktur direktori sebagai garis panduan, mari kita melalui semua fail PHP yang membentuk plugin kami dan tentukan ruang nama mereka. Melakukannya adalah mudah: Ini hanya satu perkara menggunakan kata kunci namespace dan meletakkan nama yang berkelayakan di bahagian atas setiap fail.

Saya akan senarai masing-masing di bawah.

tutsplus-namespace-demo.php

kelas-meta-box.php

kelas-meta-box-display.php

antara muka-assets.php

class-css-loader.php

class-question-reader.php

Terdapat beberapa perkara yang perlu diperhatikan mengenai konvensyen yang saya gunakan di atas:

  • Ruang nama root adalah Tutsplus_Namespace_Demo, yang sesuai dengan nama direktori plugin.
  • Selebihnya ruang nama seperti Tutsplus_Namespace_Demo\Admin dan Tutsplus_Namespace_Demo\Admin\Util juga sesuai dengan direktori masing-masing; Walau bagaimanapun, nama-nama direktori diletakkan (berbanding dengan huruf kecil).

Akhirnya, jika anda telah mencuba menyegarkan halaman atau anda cuba menavigasi di sekitar WordPress sejak memperkenalkan pernyataan ruang nama, maka anda mungkin melihat ralat dalam konsol anda yang kelihatan seperti ini:

PHP Errors when loading namespaced code

Dan ia termasuk mesej berikut:

PHP Amaran: call_user_func_array () menjangka parameter 1 menjadi panggilan panggil yang sah, fungsi 'tutsplus_namespace_demo' tidak dijumpai atau nama fungsi tidak sah di /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-includes/plugin.php pada baris 524

Atau mungkin ia menunjukkan:

Kesalahan fatal PHP: 'Meta_Box' kelas tidak dijumpai dalam /Users/tommcfarlin/Dropbox/Projects/tutsplus/wp-content/plugins/tutsplus-namespace-demo/tutsplus-namespace-demo.php pada baris 48

Atau anda mungkin melihat sebarang mesej ralat serupa yang lain. Tak mengapa. Ia biasa.

Tetapi ia menimbulkan persoalan: Ada apa dengan plugin kami? Nasib baik, tiada apa-apa. Ini diharapkan tingkah laku.

Mesej pertama yang anda lihat mungkin hasil daripada plugin lain yang telah anda pasang. Saya tidak dapat membiak sendiri; Walau bagaimanapun, apabila saya menyahaktifkan beberapa plugin lain yang saya jalankan, plugin yang dihasilkan mesej kedua (yang merupakan mesej yang saya mahu tunjukkan).

Apabila anda kod nama ruang, PHP menjangka untuk mencari kelas dalam ruang nama yang diberikan. Secara konseptual, anda boleh memikirkan kelas anda sekarang yang dimiliki oleh pakej mereka sendiri (atau subpackage) atau bagaimanapun anda menentukannya. Dan bagi fungsi untuk mengakses kelas dalam pakej, ia perlu dimaklumkan tentang pakej yang wujud.

Di sinilah fungsi dan ruang nama ruang nama tambahan dimainkan. Jadi sebelum kita cuba mengakses kod kami melalui ruang nama mereka, mari kita bekerjasama dengan autoloader.

Semua Tentang Autoloading

Menulis autoloader akan memerlukan yang berikut:

  1. memahami fungsi PHP yang dipanggil spl_autoload_register
  2. menulis fungsi yang akan memuatkan fail nama-nama kami secara automatik
  3. termasuk fungsi autoloading tersuai kami

Jangan biarkan nama spl_autoload_register menakut-nakutkan anda. Ia hanya bermaksud bahawa ini adalah fungsi yang merupakan sebahagian daripada "Standard PHP Library" dan bagaimana kita "mendaftar" fungsi "autoload". Ia bersuara untuk mengatakan dan banyak aksara untuk ditulis, tetapi ia hanya satu fungsi yang akan kita gunakan untuk memberitahu PHP cara menguraikan ruang nama dan nama kelas dan di mana ia dapat mencari fail kami.

Fungsi ini adalah apa yang membolehkan kami menulis kod tersuai kami sendiri untuk fail autoloading dan kemudian menghubungkan fungsi tersebut ke dalam PHP. Iaitu, kami akan memberitahu PHP di mana hendak mencari fail kami dan bagaimana untuk mengurai ruang nama, nama fail, dan sebagainya supaya ia termasuk fail.

Dengan semua itu, kami bersedia untuk benar-benar menulis autoloader.

Menulis Autoloader

Apabila menulis autoloader, perkara yang perlu diingat ialah bagaimana fail kami dianjurkan. Iaitu, kami ingin tahu cara memetakan ruang nama kami ke direktori kami.

Dalam contoh yang kita gunakan, ia adalah mudah: Ruang nama adalah versi struktur struktur direktori. Ini tidak semestinya berlaku untuk projek lain; Walau bagaimanapun, ini satu lagi sebab mengapa saya suka menyusun fail saya secara logik berdasarkan lokasi fizikal mereka.

Apabila PHP cuba memuat kelas, autoloader kami perlu melakukan perkara berikut:

  1. Pisah ruang nama berdasarkan slash.
  2. Pisah pakej dan subpackage sehingga berdasarkan garis bawah dan gantikan mereka dengan tanda hubung (jika perlu).
  3. Ketahui cara memetakan nama kelas, antara muka, dan sebagainya untuk nama fail.
  4. Buat representasi rentetan nama fail berdasarkan maklumat di atas.
  5. Sertakan fail tersebut.

Dengan semua perkara yang dibuat, kami mendapat pekerjaan kami untuk kami. Dalam direktori plugin, buat subdirektori yang disebut inc, dan dalam direktori inc membuat fail bernama autoload.php.

Di dalam fail itu, mari kita teruskan dan melancarkan fungsi yang akan kita gunakan untuk autoload fail kita. Ia sepatutnya kelihatan seperti ini:

Jelas sekali, ini belum lagi dilakukan.

Nota Sisi untuk Menulis Autoloader

Perhatikan bahawa saya akan menulis kod dan komen kod untuk menjelaskan dengan jelas apa yang kami lakukan. Jika anda hanya menceburi diri anda buat pertama kali, menulis autoloader bersama dengan menggunakan ruang nama dan bekerja dengan fail mungkin agak mengecewakan. Di sinilah debugger dan menggunakan fail log boleh digunakan.

Ini adalah di luar skop tutorial ini, tapi ketahuilah bahawa menulis autoloader bukanlah sesuatu yang anda mungkin mendapat tepat pada kali pertama anda melakukannya.

Melengkapkan Autoloader

Mari mulakan menambah beberapa fungsi memandangkan langkah-langkah yang disenaraikan pada permulaan bahagian ini.

Pertama, kita perlu menyediakan satu gelung yang akan melelong ke belakang melalui bahagian-bahagian nama fail yang diluluskan ke fungsi autoloading. Kami melakukan ini kerana ia memudahkan untuk membina laluan ke fail ke autoload.

Selepas ini, kita perlu melihat $file_parts dan menggantikan semua kejadian underscore dengan tanda sempang kerana semua nama kelas dan antara muka menggunakan menggariskan manakala nama fail kami menggunakan tanda hubung.

Dua baris berikut adalah dua baris pertama di dalam gelung yang kita jalankan di atas:

Seterusnya, kami akan memerlukan bersyarat yang melakukan beberapa perkara.

  1. Ia perlu menyemak untuk melihat kemasukan laluan nama fail yang kami baca.
  2. Jika kita berada di entri pertama, maka kita berada di nama fail; sebaliknya, kami berada di ruang nama.
  3. Seterusnya, jika kita membaca entri pertama, kita perlu menentukan sama ada kita sedang mencuba untuk menyambungkan antara muka atau kita memuat kelas.
  4. Jika ia adalah bekas, maka kita perlu menyesuaikan nama antara muka supaya kita memuat dengan betul berdasarkan nama failnya; sebaliknya, kita akan memuat kelas berdasarkan nilai dalam pembolehubah semasa$.

Ia berbunyi seperti banyak, tetapi ia tidak sepatutnya sangat rumit untuk dibaca. Lihat kod komen di bawah:

Dengan itu, sudah tiba masanya untuk membina jalan yang memenuhi syarat sepenuhnya untuk fail itu. Nasib baik, ini lebih sedikit daripada concatenation tali asas:

Akhir sekali, kita perlu memastikan fail itu wujud. Jika tidak, kami akan memaparkan mesej ralat standard WordPress:

Dan pada ketika ini, kami mempunyai autoloader penuh (yang boleh diambil dengan memuat turun fail dari pautan di bar sisi jawatan ini kerana kod sumber akan agak lama untuk dimuatkan di sini dalam tutorial).

Akhirnya, penting untuk diperhatikan bahawa fungsi tertentu ini boleh (atau harus) ditulis semula sebagai kelas. Selain itu, kelas harus terdiri daripada beberapa fungsi yang lebih kecil yang boleh diuji, mempunyai tanggungjawab tunggal, dan membaca lebih jelas daripada apa yang di atas. Mungkin dalam tutorial bonus, saya akan berjalan melalui proses yang kelihatan seperti itu.

Tetapi Kami Masih Termasuk Fail

Jika anda melihat berhampiran dengan bahagian atas fail plugin utama (atau fail bootstrap yang sering kita panggil), anda akan melihat beberapa pernyataan termasuk yang kelihatan seperti ini:

Memandangkan kerja yang telah kami lakukan hingga ke tahap ini, akhirnya kami dapat mengalih keluar kenyataan ini dan menggantikannya dengan hanya satu:

Untuk menjadi jelas, kami menggantikannya dengan autoloader kami. Pada ketika ini, kita perlu dilakukan dengan plugin kami.

Meletakkan Semuanya Bersama-sama

Sekarang kita telah memberi nama kepada kod kami untuk menyediakan organisasi logik kelas yang berkaitan, dan menulis autoloader untuk memasukkan fail secara automatik berdasarkan ruang nama dan lokasi fail setiap kelas, kita seharusnya dapat memulakan plugin kami dan menjalankannya dengan tepat seperti yang dilakukannya semasa lelaran yang berjaya pertama.

Perkara terakhir yang perlu kita lakukan ialah memastikan kita mengemas kini fail bootstrap supaya kita mengarahkan PHP untuk menggunakan ruang nama untuk Meta_Box, Meta_Box_Display, Question_Reader, dan CSS_Loader.

Perhatikan dalam kod di atas kita menggunakan kata kunci penggunaan PHP, dan kami menyusun nama kelas kami dengan subpackages segera mereka. Anda boleh membaca lebih lanjut mengenai penggunaan dalam manual, tetapi yang pendek adalah:

Kata kunci penggunaan mesti diisytiharkan dalam skop luar sesuatu fail (skop global) atau di dalam pernyataan ruang nama. Ini kerana pengimportan dilakukan pada masa penyusunan dan tidak runtime, jadi ia tidak dapat disekat.

Dengan itu dan dengan mengandaikan semua kerja dengan betul, anda harus dapat menavigasi ke halaman Add New Post (atau Edit Post), lihat kotak meta kami, dan lihat pertanyaan yang dipersoalkan di sepanjang bahagian atas bar sisi:

The meta box prompting users for inspiration

Jika ya, tahniah. Anda telah berjaya menyediakan plugin anda ke ruang nama dan autoloading anda. Jika tidak, semak semula kod terhadap apa yang kami kongsi di sini, semak semula log kesalahan anda, dan pastikan tiada apa yang dipaparkan daripada biasa dalam skrin pentadbiran WordPress.

Jika anda dapat melihat sesuatu, kemungkinannya ada kaitannya dengan sesuatu yang kecil. Semak kod yang telah kami tutup, bandingkan dengan apa yang dilampirkan di sini pada siaran ini (di bar sisi bersama dengan butang biru besar), dan lihat jika anda boleh mengecilkan isu tersebut.

Kesimpulan

Pada ketika ini, kami telah sampai ke penghujung siri kami. Sepanjang empat tutorial terakhir, kami telah merangkumi banyak alasan:

  • Kami telah membina plugin yang mendorong pengguna dengan soalan untuk membantu memulakan blog mereka.
  • Kami telah menggunakan fungsi PHP untuk membaca fail dari sistem fail dan memaparkannya dalam paparan.
  • Kami telah menentukan ruang nama dan autoloading, dan melihat bagaimana ia boleh digunakan.
  • Kami telah menganjurkan kod kami dan menulis autoloader kami sendiri, menjadikan kod itu lebih mudah dibaca, teratur, dan kurang berantakan.

Pada akhirnya, banyak bahan yang diliputi sepanjang siri ini boleh digunakan dalam projek-projek yang ada dan masa depan yang mana anda boleh bekerja.

Ingat bahawa anda juga boleh mencari produk lain yang berkaitan dengan WordPress di pasaran kami. Dan jika anda ingin mengetahui lebih lanjut tentang membangunkan penyelesaian untuk WordPress, anda boleh mencari semua tutorial dan siri saya pada halaman profil saya. Jangan teragak-agak untuk mengikuti di blog saya atau Twitter saya kerana saya membincangkan pembangunan perisian dalam konteks WordPress hampir setiap hari.

Dan ingatlah, pautan itu untuk memuat turun kod sumber akhir adalah di bar sisi di bawah butang berjudul Muat turun Lampiran. Sudah tentu, jangan teragak-agak untuk bertanya apa-apa soalan dalam komen!

Sumber

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.