Bagaimana cara menamai file kelas namespaced?

9

WP Core Handbook> Standar Pengodean PHP> Konvensi Penamaan menyarankan yang berikut untuk menamai file dengan kelas:

Nama file kelas harus didasarkan pada nama kelas dengan class- prepended dan garis bawah pada nama kelas diganti dengan tanda hubung, misalnya WP_Errormenjadi:

class-wp-error.php

Sementara dari kata-kata bagian ini terutama ditujukan untuk penggunaan inti , gaya pengkodean secara keseluruhan umumnya tidak (dan menurut saya) berlaku untuk kode WP pihak ketiga.

Namun karena core tidak mendukung ruang nama (PHP 5.2, ugh) ini tidak menjelaskan kasus tersebut.

Apa cara praktis untuk melakukannya dari sudut pandang kenyamanan pengembang? Dukungan autoloaders?

Saya bisa melihat beberapa cara alternatif:

  • mengabaikan namespace sama sekali
  • termasuk namespace dalam nama file
  • menggunakan ruang nama sebagai level folder
  • menggunakan skema penamaan alternatif sama sekali, seperti PSR
Jarang
sumber
3
Pendapat saya yang jujur ​​adalah bahwa jika Anda menggunakan PHP 5.3+ Anda sudah melanggar aturan inti WP. Selain itu pertimbangkan bahwa standar WP tidak memperhitungkan antarmuka atau sifat-sifat akun. Jadi bagi saya masuk akal untuk memilih cara yang nyaman bagi Anda dan menggunakan standar yang sudah mapan seperti PSR tampaknya pilihan yang lebih baik dalam hal itu.
gmazzap

Jawaban:

7

Pertama, abaikan class-awalan. Ini berasal dari pendekatan kode prosedural murni WordPress, kelas digunakan sebagai wadah untuk kode prosedural, bukan untuk objek nyata, dan sebagian besar file tidak mengandung kelas sama sekali atau kelas dan kode lainnya bersamaan. Tidak masuk akal ketika semua file Anda hanya berisi satu kelas dan tidak ada yang lain.
Jika Anda akan mengikuti pola itu, Anda harus menggunakan interface-foo.phpdan trait-bar.php. Itu tidak hanya terlihat konyol, itu membuat pemuatan otomatis lebih sulit dari yang diperlukan.

Cara termudah untuk memisahkan ruang nama dan nama kelas / antarmuka / sifat adalah (berdasarkan pengalaman saya) menugaskan ruang nama untuk nama direktori dan nama kelas ke nama file. Ini membuatnya sangat mudah untuk memetakan kelas yang diminta ke struktur file yang diberikan dalam pemuat otomatis: Konversi \ke /, tambahkan, .phpdan muat file.

Ini membuatnya juga mudah untuk me-cache pencarian: untuk setiap direktori / namespace Anda dapat mengambil semua file yang ada saat pertama kali direktori diminta, dan untuk panggilan selanjutnya Anda dapat menggunakan kembali daftar nama file tanpa meminta file_exists()setiap kali .

fuxia
sumber
4
Dengan kata lain: Jadikan PSR kompatibel :)
kaiser
2

Saya telah membuat kelas untuk persyaratan ini, kompatibel dengan PSR-4 dan mengikuti standar pengkodean Wordpress.

Anda dapat mencapainya di sini: https://github.com/pablo-pacheco/wp-namespace-autoloader

Penjelasannya ada di sana tetapi pada dasarnya itu adalah ketergantungan komposer. Anda hanya perlu mewajibkannya dalam proyek Anda:

"require": {    
    "pablo-pacheco/wp-namespace-autoloader": "dev-master"
}

Dan kemudian memanggil kelas

<?php
new \WP_Namespace_Autoloader( array(    
    'directory'   => __DIR__,       // Directory of your project. It can be your theme or plugin. __DIR__ is probably your best bet.    
    'namespace'   => __NAMESPACE__, // Main namespace of your project. E.g My_Project\Admin\Tests should be My_Project. Probably if you just pass the constant __NAMESPACE__ it should work     
    'classes_dir' => 'src',         // (optional). It is where your namespaced classes are located inside your project. If your classes are in the root level, leave this empty. If they are located on 'src' folder, write 'src' here 
) );
Pablo SG Pacheco
sumber
1

Saya biasanya memilih bagian kedua dari opsi Anda:

  • menggunakan ruang nama sebagai level folder
  • menggunakan skema penamaan alternatif sama sekali, seperti PSR

Jika Anda menggunakan komposer untuk mendaftarkan autoloader PSR-4 Anda dapat tetap dekat dengan konvensi penamaan WP. Ruang nama dipetakan ke folder yang dapat berisi garis bawah dengan file bernama seperti kelas yang juga bisa berisi garis bawah. Suka:

<Namespace_Dir>/Class_Name.php

Ketika WP beralih ke php 5.3+ (itu harus terjadi pada akhirnya, kan ?!) pedoman perlu diperbarui. Karena PSR-0 sudah tidak digunakan lagi, PSR-4 harus paling tidak direkomendasikan jika tidak diperlukan.

cfoellmann
sumber
0

Solusi pablo-sg-pacheco bekerja untuk saya, autoloading bergantung pada komposer namun kompatibel dengan standar pengkodean WordPress, namun url untuk repo Github adalah:

https://github.com/pablo-sg-pacheco/wp-namespace-autoloader

dan nama paketnya adalah:

"require": {    
    "pablo-sg-pacheco/wp-namespace-autoloader": "dev-master"
}

Akhirnya, Anda juga perlu menambahkan yang berikut ke komposer Anda. Json karena paket itu tidak tersedia di paket:

"repositories": [{
    "type": "vcs",
    "url": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader"
}] 
guillaume.molter
sumber