Apakah ruang nama itu?

241

Apa itu PHP Namespaces?

Apakah ruang nama secara umum?

Jawaban awam dengan contoh akan sangat bagus.

Imran
sumber

Jawaban:

574

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.

Skenario

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.

Contoh

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();

Tidak ada Namespaces?

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.

cbednarski
sumber
Untuk beberapa alasan saya berpikir bahwa jika Anda menggunakan namespaces dalam file1 Anda tidak perlu atau memasukkan file dalam file2. Pengujian unit menunjukkan bahwa ini bukan masalahnya.
Aaron Bell
1
@ AaronBell Anda mungkin ingin memeriksa autoloading .
cbednarski
21

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.

namespace my\namespace;

Anda dapat menemukan lebih banyak informasi tentang dokumentasi PHP resmi untuk ruang nama .

alex
sumber
11

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 situlah namespaceberguna dan usekata 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\Controllersjadi 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 usekata kunci " ", yang kita gunakan, usekata kunci " " untuk membuat kelas kita mengetahui kelas atau fungsi tertentu yang ingin kita gunakan di kelas kita

jadi 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", usekata 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 askata 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".

Bahman
sumber
9

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 ):

Apakah ruang nama itu? Dalam definisi yang luas, ruang nama adalah cara untuk mengenkapsulasi item. Ini dapat dilihat sebagai konsep abstrak di banyak tempat. Misalnya, dalam direktori sistem operasi apa pun berfungsi untuk mengelompokkan file terkait, dan bertindak sebagai namespace untuk file di dalamnya. Sebagai contoh nyata, file foo.txt dapat ada di direktori / home / greg dan di / home / lainnya, tetapi dua salinan foo.txt tidak dapat hidup berdampingan di direktori yang sama. Selain itu, untuk mengakses file foo.txt di luar direktori / home / greg, kita harus menambahkan nama direktori ke nama file menggunakan pemisah direktori untuk mendapatkan /home/greg/foo.txt. Prinsip yang sama ini meluas ke ruang nama di dunia pemrograman.

2ndkauboy
sumber
1
Membandingkan dengan Jawa adalah ide yang buruk. Java memiliki paket dan ada kelas visibilitas paket. Visibilitas anggota yang dilindungi juga tergantung pada paket yang mengaksesnya.
Artefacto
1
Mereka tidak sama dengan paket tetapi mereka berbagi ide yang sama.
2ndkauboy
Ketika pertanyaan juga menanyakan ruang nama apa yang secara umum, jawabannya masuk akal.
kiamlaluno
@kiam Mereka berbagi satu ide - nama kelas yang tidak berbenturan. Mereka tidak berbagi gagasan tentang visibilitas.
Artefacto
@ Artefacto: Kau-Boy tidak mengatakan ruang nama di kedua bahasa itu sama.
kiamlaluno
4

Sama seperti direktori dan file , namespace dalam PHP berfungsi untuk mengelompokkan kelas , fungsi , antarmuka , dan konstanta .

Contoh:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

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:

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

Prinsipnya meluas ke namespace dalam kata pemrograman.


sumber
3

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.

ahli statika
sumber
2

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.

Alexander
sumber
2

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.

Mamun Sabuj
sumber
0

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.

Emmanuel David
sumber
Apa yang Anda maksud dengan "metode jQuery no konflik"? Bagaimana itu terkait dengan PHP?
Nico Haase
0

Namespace adalah sistem sederhana untuk mengontrol nama-nama dalam suatu program.
Ini memastikan bahwa nama-nama itu unik dan tidak akan menimbulkan konflik.

humaid
sumber
"Nama" macam apa yang Anda bicarakan?
Nico Haase
0

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.

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

Referensi- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb

Ashwani Garg
sumber
1
Harap berhati-hati dengan menautkan ke konten Anda sendiri di situs yang berbeda, Anda tidak ingin menjadi spammer . Anda harus memasukkan sebagian besar konten di sini, dan menggunakan tautan hanya sebagai referensi.
Dharman