Pro dan kontra ruang nama vs termasuk / perlu dalam PHP?

20

Saya baru-baru ini mulai menggunakan namespace dalam PHP. Ketika saya pertama kali melihat mereka, saya pikir sintaksisnya jelek dan saya tidak pernah menggunakannya. Namun, saya membuat autoloader (spl_autoload_register) yang membuatnya sehingga saya tidak perlu menulis pernyataan sertakan / perlu lagi.

Saya suka ruang nama, tetapi apakah ada manfaat obyektif selain menyertakan / memerlukan pernyataan, atau apakah mereka metode yang sama persis untuk mencapai tujuan yang sama?

NobleUplift
sumber
1
Ruang nama mencegah tabrakan dengan pustaka pihak ketiga.
Reactgular
1
Saat ini manfaat utama bagi saya mengenai ruang nama adalah autoloading. Sebagai contoh, saya menggunakan in-line new \Vendor\Namespace\Class()tanpa memerlukan pernyataan sebelumnya dalam metode atau kelas.
NobleUplift
3
Banyak perpustakaan PHP menggunakan autoloading tanpa ruang nama. PHP harus membuat ruang nama menjadi wajib.
Reactgular
Tidak ada argumen dari saya. Saya ingin melihat semua perubahan ini tercantum di sini .
NobleUplift

Jawaban:

21

Ruang nama tidak hanya untuk kelas autoloading. Mereka juga mencegah konflik penamaan. Padahal, itulah tujuan utama mereka.

Katakanlah Anda memiliki proyek yang memerlukan kelas yang bernama User, untuk menyimpan info tentang pengguna aplikasi Anda, tetapi sebuah plugin juga menggunakan kelas (berbeda) yang dinamai Useruntuk menyimpan informasi. Namespaces memungkinkan Anda membuat kelas Anda dalam satu namespace (katakanlah, MyApp) dan biarkan plugin menggunakan namespace lain (katakanlah, CoolPlugin). Kode di dalam MyAppruang hanya bisa merujuk ke User(misalnya, new User();), dan begitu juga kode di CoolPluginruang; masing-masing akan mendapatkan hasil yang diharapkan. Saat Anda perlu menggunakan kode dari namespace lain , Anda tinggal awali saja. Misalnya, kode dalam CoolPluginruang dapat mengakses Userkelas MyAppmelaluinew \MyApp\User();

Alternatifnya adalah bahwa setiap kelas membutuhkan nama yang kompleks di mana-mana , seperti class MyApp_Userdan class CoolPlugin_User. Ruang nama memungkinkan Anda menyederhanakan banyak hal dan menghindari konflik penamaan sepanjang waktu.

Sunting: Untuk menjawab pertanyaan, "Apakah ada perbedaan kinerja antara keduanya?"

Bukan yang berarti, tidak. Saya belum membandingkannya, tetapi mungkin ada perbedaan pada tingkat nanodetik. Yang mengatakan, mengorbankan kualitas kode untuk tweak kinerja super kecil bukanlah strategi yang baik, jadi Anda harus menggunakan ruang nama apa pun. Untuk tolok ukur masalah serupa, lihat PHPbench.com dan jawaban StackOverflow ini .

Kode Anda harus sangat ketat dan sangat sensitif terhadap waktu (pikirkan perdagangan frekuensi tinggi atau kelola reaksi nuklir) sebelum Anda perlu khawatir tentang pengoptimalan mikro dalam konteks seperti ini. Jika itu benar-benar sensitif terhadap waktu, Anda mungkin harus mengkode dalam atau bahkan , bukan bahasa yang ditafsirkan seperti PHP.

elixenide
sumber
1
+1 Saya hanya mencatat bahwa setiap proyek mulai tampak seperti tidak mungkin memerlukan ruang nama, dan kemudian dengan mudah tumbuh sampai pada titik yang konyol untuk meretas hal-hal untuk bekerja tanpa mereka. Tidak memiliki ruang nama pada dasarnya sama dengan mendeklarasikan setiap variabel global, seperti yang diterapkan pada kelas. Pada basis kode yang lebih besar atau yang menggunakan perpustakaan secara liberal, itu menjadi berantakan total.
BrianH
1
Silakan lihat hasil edit saya di atas.
elixenide
2
Apakah saya menyebutkan bahwa saya membuat antarmuka PHP untuk Large Hadron Collider? Kalau tidak, saya yakin jawaban ini cukup, terima kasih.
NobleUplift
1
Tolong jangan buat bintang quark atau lubang hitam! Senang untuk membantu.
elixenide
1
Jangan khawatir, hanya cekikan. Kami sedang membuat meriam hadron - maksud saya, sesuatu yang canggih dan bukan senjata.
NobleUplift