Baru-baru ini saya telah membaca tentang ruang nama dan bagaimana mereka bermanfaat. Saat ini saya sedang membuat proyek di Laravel dan mencoba untuk beralih dari autoloading peta kelas ke namespacing. Namun, saya tidak bisa memahami apa perbedaan sebenarnya antara PSR-0 dan PSR-4.
Beberapa sumber yang saya baca adalah ...
Apa yang saya mengerti:
- PSR-4 tidak mengonversi garis bawah ke pemisah direktori
- Aturan spesifik tertentu dari komposer menyebabkan struktur direktori menjadi kompleks yang pada gilirannya membuat PSR-0 namespacing verbose dan dengan demikian PSR-4 dibuat
Contoh yang menjelaskan perbedaan akan dihargai.
Jawaban:
Mereka sangat mirip sehingga tidak mengherankan bahwa ini agak membingungkan. Ringkasannya adalah bahwa PSR-0 memiliki beberapa fitur kompatibilitas mundur untuk kelas-gaya PEAR-gaya yang menjatuhkan PSR-4, karena itu hanya mendukung kode ruang nama. Selain itu PSR-4 tidak memaksa Anda untuk memiliki seluruh namespace sebagai struktur direktori, tetapi hanya bagian yang mengikuti titik jangkar.
Sebagai contoh jika Anda menentukan bahwa
Acme\Foo\
namespace berlabuh disrc/
, dengan PSR-0 berarti itu akan mencariAcme\Foo\Bar
disrc/Acme/Foo/Bar.php
sementara di PSR-4 akan mencarinya disrc/Bar.php
, memungkinkan untuk struktur direktori yang lebih pendek. Di sisi lain beberapa lebih suka memiliki struktur direktori lengkap untuk melihat dengan jelas apa yang ada di namespace, jadi Anda juga bisa mengatakan bahwaAcme\Foo\
ada di dalamsrc/Acme/Foo
dengan PSR-4 yang akan memberi Anda setara dengan perilaku PSR-0 yang dijelaskan di atas.Singkat cerita untuk proyek baru dan untuk sebagian besar maksud dan tujuan, Anda dapat menggunakan PSR-4 dan melupakan semua tentang PSR-0.
sumber
src/Bar.php
jika Anda katakanAcme\Foo\ => src/
Inilah perbedaan utama,
1. Misalnya jika Anda menetapkan bahwa
Acme\Foo\
namespace berlabuh disrc/
,Acme\Foo\Bar
disrc/Acme/Foo/Bar.php
Acme\Foo\Bar
disrc/Bar.php(where Bar class is)
.2. PSR-4 tidak mengubah garis bawah ke pemisah direktori
3. Anda lebih suka menggunakan PSR-4 dengan ruang nama
4. PSR-0 tidak akan berfungsi walaupun nama kelasnya berbeda dari nama file, seperti mempertimbangkan contoh di atas:
Acme\Foo\Bar
--->src/Acme/Foo/Bar.php
(untuk kelas Bar) akan berfungsiAcme\Foo\Bar
--->src/Acme/Foo/Bar2.php
(untuk kelas Bar) tidak akan berfungsisumber
PSR-4 adalah sesuatu seperti 'jalur relatif', PSR-0, 'jalur absolut'.
misalnya
konfigurasi:
PSR-0 autoload:
Memuat otomatis PSR-4 :
Dan ada beberapa perbedaan lebih detail antara PSR-0 dan PSR-4, lihat di sini: http://www.php-fig.org/psr/psr-4/
sumber
Konvensi Namespace / folder.
Kelas harus disimpan dalam folder sesuai dengan ruang namanya.
Secara umum, Anda akan membuat direktori src / di folder root Anda, duduk di tingkat yang sama dengan vendor /, dan menambahkan proyek Anda di sana. Di bawah ini adalah contoh dari struktur folder:
Perbedaan antara psr-0 dan psr-4
psr-0
Itu sudah ditinggalkan. Melihat
vendor/composer/autoload_namespaces.php
file Anda dapat melihat ruang nama dan direktori tempat mereka dipetakan.composer.json
psr-4
Melihat
vendor/composer/autoload_psr4.php
file Anda dapat melihat ruang nama dan direktori tempat mereka dipetakan.composer.json
composer.json
sumber
Bahkan ketika saya mencoba tetapi Komposer berantakan. Sayangnya, ini satu-satunya alternatif. Dari pasar.
Mengapa berantakan?
Autocomplete komposer berfungsi dengan baik jika Anda mengendalikan kode. Namun, jika Anda mengimpor proyek yang berbeda, Anda mendapati diri Anda memiliki banyak gaya dan cara untuk membuat folder. Sebagai contoh, beberapa proyek adalah /company/src/class.php sementara yang lain adalah perusahaan / class.php dan yang lain adalah perusahaan / src / class / class.php
Saya membuat perpustakaan yang menyelesaikannya:
https://github.com/EFTEC/AutoLoadOne (gratis, MIT).
Ini menghasilkan autoinclude dengan memindai semua kelas folder, sehingga berfungsi dalam setiap kasus (psr-0 psr-4, kelas tanpa namespace, file dengan banyak kelas ..
sunting: Dan lagi, diturunkan tanpa alasan. ;-)
sumber