Apa itu PHP Namespaces?
Apakah ruang nama secara umum?
Jawaban awam dengan contoh akan sangat bagus.
sumber
Apa itu PHP Namespaces?
Apakah ruang nama secara umum?
Jawaban awam dengan contoh akan sangat bagus.
Namespacing tidak untuk fungsi dan kelas apa ruang lingkup tidak untuk variabel. Ini memungkinkan Anda untuk menggunakan fungsi atau nama kelas yang sama di berbagai bagian program yang sama tanpa menyebabkan tabrakan nama.
Dalam istilah sederhana, pikirkan namespace sebagai nama keluarga seseorang . Jika ada dua orang bernama "John" Anda dapat menggunakan nama keluarga mereka untuk membedakan mereka.
Misalkan Anda menulis aplikasi yang menggunakan fungsi bernama output()
. output()
Fungsi Anda mengambil semua kode HTML pada halaman Anda dan mengirimkannya kepada pengguna.
Kemudian aplikasi Anda menjadi lebih besar dan Anda ingin menambahkan fitur baru. Anda menambahkan perpustakaan yang memungkinkan Anda untuk menghasilkan umpan RSS. Pustaka ini juga menggunakan fungsi yang diberi nama output()
untuk menampilkan umpan terakhir.
Saat Anda menelepon output()
, bagaimana PHP tahu apakah akan menggunakan output()
fungsi Anda atau fungsi perpustakaan RSS output()
? Tidak. Kecuali Anda menggunakan ruang nama.
Bagaimana kita menyelesaikan memiliki dua output()
fungsi? Sederhana. Kami menempel setiap output()
fungsi di ruang namanya sendiri .
Itu akan terlihat seperti ini:
namespace MyProject;
function output() {
# Output HTML page
echo 'HTML!';
}
namespace RSSLibrary;
function output(){
# Output RSS feed
echo 'RSS!';
}
Nanti ketika kita ingin menggunakan fungsi yang berbeda, kita akan menggunakan:
\MyProject\output();
\RSSLibrary\output();
Atau kita dapat menyatakan bahwa kita berada di salah satu ruang nama dan kemudian kita bisa memanggil ruang nama itu output()
:
namespace MyProject;
output(); # Output HTML page
\RSSLibrary\output();
Jika kami tidak memiliki ruang nama, kami harus (berpotensi) mengubah banyak kode setiap kali kami menambahkan pustaka, atau membuat awalan yang membosankan untuk menjadikan nama fungsi kami unik. Dengan ruang nama, kita dapat menghindari sakit kepala penamaan tabrakan saat menggabungkan kode pihak ketiga dengan proyek kita sendiri.
Namespace memungkinkan Anda untuk menempatkan banyak kode di bawah nama dan tidak memiliki konflik penamaan dengan kelas, fungsi dan konstanta.
Ini memungkinkan kode Anda untuk hidup di namespace itu.
PHP menggunakan karakter yang agak kontroversial
\
untuk menunjukkan level namespace. Orang-orang bangkit dengan tangan karena itu juga digunakan sebagai karakter pelarian.Untuk menggunakan namespace di PHP, gunakan sesuatu seperti ini di bagian atas file Anda.
Anda dapat menemukan lebih banyak informasi tentang dokumentasi PHP resmi untuk ruang nama .
sumber
Karena lebih mudah untuk belajar tentang kata kunci "gunakan" dengan mengetahui tentang "namespace", izinkan saya menjelaskan namespace terlebih dahulu dengan melihat proyek Laravel dasar.
Ada kelas controller dengan nama: Controller.php yang ada di path: app / Http / Controllers dari direktori root proyek. Ada juga kelas controller yang bernama: Controller.php , tetapi yang ini ada di path: vendor / laravel / framework / src / Illuminate / Routing dari direktori root proyek
Anda tidak perlu melihat kode sumbernya jika Anda baru mengenal php karena dapat membingungkan Anda, sebagai gantinya saya akan menjelaskan kepada Anda bagian dari hal itu yang kami pedulikan dan akan membantu kami memahami "namespace" dan "gunakan" ”
Jadi sebenarnya, kelas controller pertama kami: app / Http / Controllers / Controller.php perlu menggunakan vendor kelas controller kedua / laravel / framework / src / Illuminate / Routing / Controller.php . sebenarnya perlu memperluas Kelas ini untuk memiliki akses ke kontennya untuk menangani beberapa fungsi routing yang penting.
Jadi bagaimana sebuah kelas dapat memperluas kelas lain yang memiliki nama yang sama?
class Controller extends Controller
? ini TIDAK akan berhasil, kecuali ada cara untuk membedakan kedua kelas ini dan di situlahnamespace
berguna danuse
kata kunci membantu untuk menyelesaikan misi, memungkinkan penggunaan; (kelas; metode; antarmuka dan konstanta), dengan nama yang sama, dalam cakupan yang sama.sekarang bagaimana cara melakukannya dalam kode? sangat sederhana! jika kita melihatkode sumber app / Http / Controllers / Controller.php , kita dapat melihat di bagian atas namespace kelas dinyatakan sebagai:,
namespace App\Http\Controllers
jadi ini adalah bagaimana Anda memberikan kelas Anda namespace sehingga dapat direferensikan oleh kelas lain sekarang ini terlihat sama dengan jalur ke kelas ini dari direktori root proyek, dengan sedikit perbedaan dan itulah penggunaan "\
" alih-alih "/
" (sama dengan command prompt di windows) , tetapi ada perbedaan lain dan itulah App dengan modal 'A' di namespace versus 'app' dengan Huruf kecil 'a' di jalur. Perhatikan juga bahwa namespace peka huruf besar-kecil.Jadi namespace adalah konsep terpisah dari path, ia dapat mengikuti struktur path jika itu membantu tetapi tidak harus path yang tepat ke kelas, metode, antarmuka atau konstanta misalnya lihat: vendor / laravel / framework /src/Illuminate/Routing/Controller.php kode sumber,
kita melihat di bagian atas kelas namespace dideklarasikan sebagai:
Illuminate\Routing
sekarang mari kita lihat
use
kata kunci " ", yang kita gunakan,use
kata kunci " " untuk membuat kelas kita mengetahui kelas atau fungsi tertentu yang ingin kita gunakan di kelas kitajadi kita tidak mengimpor atau memasukkan apa pun yang kita hanya membiarkan kelas kita tahu bahwa kita akan menggunakan kelas atau metode tertentu dengan merujuk mereka dengan namespace mereka mari kita lihat kode app / Http / Controllers / Controller.php , seperti Anda dapat melihat dari baris: "
use Illuminate\Routing\Controller as BaseController
",use
kata kunci " " diikuti oleh namespace untuk kelas target (perhatikan bahwa Illuminate \ Routing \ Controller.php dan Illuminate \ Routing \ Controller 'tanpa .php extension' dapat dipertukarkan)kita dapat menggunakan
as
kata kunci " " bersama dengan kata kunci "use
" untuk memberikan kelas tertentu , metode, antarmuka atau konstanta alias yang memungkinkan aplikasi / Http / Controllers / Controller.php untuk memperluas Illuminate \ Routing \ Controller.php sebagai BaseController di baris: "class Controller extends BaseController
".sumber
Ada teknik seperti ruang nama dalam bahasa pemrograman lain (seperti paket di Jawa). Mereka digunakan untuk dapat memiliki kelas mutliple dengan nama yang sama dengan proyek.
Dari dokumentasi php ( http://www.php.net/manual/en/language.namespaces.rationale.php ):
sumber
Sama seperti direktori dan file , namespace dalam PHP berfungsi untuk mengelompokkan kelas , fungsi , antarmuka , dan konstanta .
Contoh:
Ini menyediakan cara membungkus barang dari ruang global dan memungkinkan penggunaan nama barang biasa tanpa menyebabkan benturan nama dalam suatu program. Ini didukung dalam PHP 5.3.0, PHP 7.
Tetapi ada beberapa batasan dalam analogi antara namespace PHP dan sistem file berbasis Unix:
Prinsipnya meluas ke namespace dalam kata pemrograman.
sumber
Namespace bekerja seperti direktori. Anda tahu bagaimana Anda bisa meletakkan file di direktori dengan nama yang sama dengan file di direktori induk (atau lainnya)? Nah, namespace memungkinkan Anda melakukannya dalam aplikasi untuk variabel, fungsi, dan kelas.
Ada sedikit kecenderungan di PHP beberapa saat yang lalu untuk kelas besar fungsi statis. Satu-satunya cara untuk memanggil salah satu fungsi tersebut adalah dengan mengawali panggilan dengan nama kelas. Ini adalah upaya primitif di ruang nama, tetapi dengan tidak banyak manfaatnya.
sumber
Namespace pada dasarnya memungkinkan Anda memasukkan kode ke dalam sebuah wadah. Ini akan mencegah masalah dengan dua fungsi (serta kelas dan variabel) yang memiliki nama yang sama.
Ini berguna saat bekerja ketika aplikasi yang lebih besar untuk mencegah masalah dengan potongan kode berbagi nama yang sama.
Sebagai contoh, katakanlah kita menginginkan dua fungsi yang disebut "TheMessage". Keduanya akan mencetak (echo) pesan yang berbeda masing-masing. Biasanya, ini akan menyebabkan kesalahan sintaksis, karena Anda tidak dapat memiliki dua fungsi yang memiliki nama yang sama.
Untuk memperbaikinya, Anda bisa meletakkan fungsi-fungsi ini dalam ruang nama yang terpisah. Ini akan memungkinkan Anda untuk menggunakan kedua fungsi tersebut tanpa kesalahan.
sumber
Namespace seperti mengemas banyak hal menjadi satu paket. Bayangkan sebuah namespace sebagai laci di mana Anda dapat meletakkan segala macam hal: pensil, penggaris, selembar kertas dan sebagainya. Untuk menghindari penggunaan barang satu sama lain, Anda memutuskan untuk memberi label pada laci sehingga jelas milik siapa.
sumber
Namespace digunakan untuk melampirkan grup kode sehingga mereka dapat digunakan di tempat yang berbeda tanpa konflik nama. Pikirkan ini sebagai jQuery tanpa metode konflik dan Anda akan memahaminya dengan lebih baik.
sumber
Namespace adalah sistem sederhana untuk mengontrol nama-nama dalam suatu program.
Ini memastikan bahwa nama-nama itu unik dan tidak akan menimbulkan konflik.
sumber
Anda dapat menggunakan namespace untuk menghindari tabrakan nama antara kode yang Anda buat, dan kelas / fungsi / konstanta PHP internal atau kelas / fungsi / konstanta pihak ketiga. Namespaces juga memiliki kemampuan untuk alias (atau mempersingkat) Extra_Long_Names yang dirancang untuk mengurangi masalah pertama, meningkatkan keterbacaan kode sumber.
Seperti yang kita semua tahu, ruang nama dan sifat bukanlah hal baru dalam PHP, tetapi masih banyak pengembang php tidak menggunakan konsep-konsep hebat ini karena kompleksitasnya. Jadi, dalam posting ini. Saya akan mencoba menjernihkannya dengan contoh. Apa itu namespace dan traits?
Bagaimana Anda bisa menerapkannya dalam kode Anda untuk membuat kode Anda dapat digunakan kembali dan diperluas?
Manfaat ruang nama
Anda dapat menggunakan namespace untuk menghindari tabrakan nama antara kode yang Anda buat, dan kelas / fungsi / konstanta PHP internal atau kelas / fungsi / konstanta pihak ketiga.
Namespaces juga memiliki kemampuan untuk alias (atau mempersingkat) Extra_Long_Names yang dirancang untuk mengurangi masalah pertama, meningkatkan keterbacaan kode sumber. Mari kita pahami ruang nama dengan sebuah contoh. buat nama folder "php_oops" di htdocs (xampp) atau www (xwamp) buat folder baru di bawah direktori root bernama "namespaces", & kemudian buat file index.php di bawah folder namespaces.
Referensi- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb
sumber