Catatan: Ini adalah pertanyaan referensi untuk berurusan dengan ruang lingkup variabel dalam PHP. Harap tutup salah satu dari banyak pertanyaan yang cocok dengan pola ini sebagai duplikat dari yang ini.
Apa itu "ruang lingkup variabel" di PHP? Apakah variabel dari satu file .php dapat diakses di yang lain? Mengapa saya terkadang mendapatkan kesalahan "variabel tidak terdefinisi" ?
Jawaban:
Apa itu "ruang lingkup variabel"?
Variabel memiliki "ruang lingkup" terbatas, atau "tempat dari mana mereka dapat diakses". Hanya karena Anda
$foo = 'bar';
pernah menulis di suatu tempat di aplikasi Anda tidak berarti Anda dapat merujuk$foo
dari mana saja di dalam aplikasi. Variabel$foo
memiliki ruang lingkup tertentu yang valid dan hanya kode dalam lingkup yang sama memiliki akses ke variabel.Bagaimana ruang lingkup didefinisikan dalam PHP?
Sangat sederhana: PHP memiliki lingkup fungsi . Itulah satu-satunya jenis pemisah lingkup yang ada di PHP. Variabel di dalam suatu fungsi hanya tersedia di dalam fungsi itu. Variabel di luar fungsi tersedia di mana saja di luar fungsi, tetapi tidak di dalam fungsi apa pun. Ini berarti ada satu ruang lingkup khusus dalam PHP: ruang lingkup global . Variabel apa pun yang dinyatakan di luar fungsi apa pun berada dalam lingkup global ini.
Contoh:
$foo
berada dalam lingkup global ,$baz
berada dalam lingkup lokal di dalamnyamyFunc
. Hanya kode di dalam yangmyFunc
memiliki akses$baz
. Hanya kode di luar yangmyFunc
memiliki akses$foo
. Tidak ada yang memiliki akses ke yang lain:Cakupan dan file yang disertakan
Batas file tidak memisahkan ruang lingkup:
a.php
b.php
Aturan yang sama berlaku untuk
include
kode d sebagaimana berlaku untuk kode lain: hanyafunction
ruang lingkup yang terpisah. Untuk tujuan cakupan, Anda mungkin berpikir untuk memasukkan file seperti menyalin dan menempelkan kode:cph
Dalam contoh di atas,
a.php
dimasukkan ke dalammyFunc
, variabel apa pun di dalama.php
hanya memiliki lingkup fungsi lokal. Hanya karena mereka tampaknya berada dalam lingkup globala.php
tidak berarti mereka berada, itu sebenarnya tergantung pada konteks mana kode dimasukkan / dijalankan.Bagaimana dengan fungsi di dalam fungsi dan kelas?
Setiap
function
deklarasi baru memperkenalkan ruang lingkup baru, sesederhana itu.(anonim) fungsi di dalam fungsi
kelas
Untuk apa ruang lingkup?
Menangani masalah pelingkupan mungkin tampak menjengkelkan, tetapi ruang lingkup variabel terbatas sangat penting untuk menulis aplikasi yang kompleks! Jika setiap variabel yang Anda deklarasikan akan tersedia dari mana saja di dalam aplikasi Anda, Anda akan melangkahi semua variabel Anda tanpa cara nyata untuk melacak apa yang mengubah apa. Hanya ada begitu banyak nama masuk akal yang dapat Anda berikan kepada variabel Anda, Anda mungkin ingin menggunakan variabel "
$name
" di lebih dari satu tempat. Jika Anda hanya dapat memiliki nama variabel yang unik ini sekali di aplikasi Anda, Anda harus menggunakan skema penamaan yang sangat rumit untuk memastikan variabel Anda unik dan bahwa Anda tidak mengubah variabel yang salah dari potongan kode yang salah.Mengamati:
Jika tidak ada ruang lingkup, apa fungsi fungsi di atas? Dari mana datangnya
$bar
? Status apa yang dimilikinya? Apakah bahkan diinisialisasi? Apakah Anda harus memeriksa setiap waktu? Ini tidak bisa dipertahankan. Yang membawa kita ke ...Melintasi batas ruang lingkup
Cara yang benar: meneruskan variabel masuk dan keluar
Variabel
$bar
secara eksplisit masuk ke lingkup ini sebagai argumen fungsi. Hanya dengan melihat fungsi ini, jelas dari mana nilai itu bekerja. Kemudian secara eksplisit mengembalikan nilai. Penelepon memiliki kepercayaan diri untuk mengetahui variabel apa yang akan berfungsi dengan fungsi dan dari mana nilai pengembaliannya berasal:Memperluas lingkup variabel menjadi fungsi anonim
Fungsi anonim secara eksplisit termasuk
$foo
dari ruang lingkup di sekitarnya. Perhatikan bahwa ini tidak sama dengan ruang lingkup global .Jalan yang salah:
global
Seperti yang dikatakan sebelumnya, ruang lingkup global agak spesial, dan fungsi dapat secara eksplisit mengimpor variabel dari itu:
Fungsi ini menggunakan dan memodifikasi variabel global
$foo
. Jangan lakukan ini! (Kecuali jika Anda benar-benar benar-benar benar-benar tahu apa yang Anda lakukan, dan bahkan kemudian: jangan!)Semua penelepon dari fungsi ini melihat ini:
Tidak ada indikasi bahwa fungsi ini memiliki efek samping , namun tetap berfungsi . Ini sangat mudah menjadi kekacauan yang kusut karena beberapa fungsi terus memodifikasi dan membutuhkan beberapa negara global. Anda ingin fungsi menjadi stateless , hanya bekerja pada inputnya dan mengembalikan output yang ditentukan, namun sering kali Anda memanggilnya.
Anda harus menghindari penggunaan ruang lingkup global dengan cara apa pun sebanyak mungkin; pastinya Anda tidak harus "menarik" variabel dari lingkup global ke lingkup lokal.
sumber
global
, jadi tolong beri tahu kami kapan kami harus menggunakanglobal
? Dan tolong jelaskan (sedikit) apa itustatic
..?global
. Itu selalu salah. Melewati parameter fungsi benar.static
dijelaskan dengan baik dalam manual dan tidak ada hubungannya dengan ruang lingkup. Singkatnya dapat dianggap sebagai "variabel global yang dicakup". Saya sedikit memperluas penggunaannya di sini kunststube.net/static .include_once
dan mungkinrequire_once
juga harus ditambahkan di suatu tempat; hanya mengatakan. OP juga memilih untuk membuka kembali pertanyaan mereka. Apakah posting mereka menjadi kasus khusus dan apa yang harus dilakukan?Meskipun variabel yang didefinisikan di dalam lingkup fungsi tidak dapat diakses dari luar, itu tidak berarti Anda tidak dapat menggunakan nilainya setelah fungsi tersebut selesai. PHP memiliki
static
kata kunci terkenal yang banyak digunakan dalam PHP berorientasi objek untuk mendefinisikan metode dan properti statis tetapi harus diingat bahwastatic
mungkin juga digunakan di dalam fungsi untuk mendefinisikan variabel statis.Apa itu 'variabel statis'?
Variabel statis berbeda dari variabel biasa yang didefinisikan dalam lingkup fungsi jika tidak kehilangan nilai ketika eksekusi program meninggalkan ruang lingkup ini. Mari kita perhatikan contoh penggunaan variabel statis berikut:
Hasil:
Jika kita mendefinisikan
$counter
tanpastatic
maka setiap kali nilai gema akan sama dengan$num
parameter yang diteruskan ke fungsi. Menggunakanstatic
memungkinkan untuk membangun penghitung sederhana ini tanpa solusi tambahan.Variabel statis use-cases
Trik
Variabel statis hanya ada dalam lingkup fungsi lokal. Ini tidak dapat diakses di luar fungsi yang telah ditetapkan. Jadi, Anda mungkin yakin bahwa nilainya tidak akan berubah hingga panggilan berikutnya ke fungsi tersebut.
Variabel statis hanya dapat didefinisikan sebagai skalar atau sebagai ekspresi skalar (sejak PHP 5.6). Menetapkan nilai-nilai lain padanya pasti menyebabkan kegagalan setidaknya pada saat artikel ini ditulis. Namun demikian Anda dapat melakukannya hanya di baris kode berikutnya:
Hasil:
Fungsi statis agak 'dibagi' antara metode objek dari kelas yang sama. Mudah dimengerti dengan melihat contoh berikut:
Ini hanya berfungsi dengan objek dari kelas yang sama. Jika objek berasal dari kelas yang berbeda (bahkan saling memperluas satu sama lain) perilaku statis statis akan seperti yang diharapkan.
Apakah variabel statis satu-satunya cara untuk menjaga nilai antara panggilan ke suatu fungsi?
Cara lain untuk menjaga nilai antara panggilan fungsi adalah dengan menggunakan penutupan. Penutupan diperkenalkan di PHP 5.3. Dalam dua kata mereka memungkinkan Anda untuk membatasi akses ke beberapa set variabel dalam lingkup fungsi ke fungsi anonim lain yang akan menjadi satu-satunya cara untuk mengaksesnya. Berada dalam variabel penutupan dapat meniru (kurang lebih berhasil) konsep OOP seperti 'konstanta kelas' (jika mereka lulus dalam nilai penutupan) atau 'properti pribadi' (jika disahkan oleh referensi) dalam pemrograman terstruktur.
Yang terakhir ini sebenarnya memungkinkan untuk menggunakan closure daripada variabel statis. Apa yang harus digunakan selalu tergantung pada pengembang untuk memutuskan tetapi harus disebutkan bahwa variabel statis pasti berguna ketika bekerja dengan rekursi dan layak untuk diperhatikan oleh devs.
sumber
Saya tidak akan memposting jawaban yang lengkap untuk pertanyaan, karena yang sudah ada dan manual PHP melakukan pekerjaan yang baik untuk menjelaskan sebagian besar dari ini.
Tapi satu subjek yang tidak terjawab adalah bahwa dari superglobals , termasuk yang umum digunakan
$_POST
,$_GET
,$_SESSION
, dll Variabel ini array yang selalu tersedia, dalam lingkup apapun, tanpaglobal
deklarasi.Misalnya, fungsi ini akan mencetak nama pengguna yang menjalankan skrip PHP. Variabel tersedia untuk fungsi tanpa masalah.
Aturan umum "global buruk" biasanya diubah dalam PHP menjadi "global buruk tetapi superglobals baik-baik saja," selama seseorang tidak menyalahgunakannya. (Semua variabel ini dapat ditulisi, sehingga mereka dapat digunakan untuk menghindari injeksi ketergantungan jika Anda benar-benar mengerikan.)
Variabel-variabel ini tidak dijamin hadir; seorang administrator dapat menonaktifkan beberapa atau semuanya menggunakan
variables_order
arahan dalamphp.ini
, tetapi ini bukan perilaku umum.Daftar superglobals saat ini:
$GLOBALS
- Semua variabel global dalam skrip saat ini$_SERVER
- Informasi tentang server dan lingkungan eksekusi$_GET
- Nilai yang dikirimkan dalam string kueri URL, terlepas dari metode HTTP yang digunakan untuk permintaan$_POST
- Nilai yang dikirimkan dalam permintaan HTTP POST denganapplication/x-www-form-urlencoded
ataumultipart/form-data
tipe MIME$_FILES
- File yang dikirimkan dalam permintaan POST HTTP denganmultipart/form-data
tipe MIME$_COOKIE
- Cookie berlalu dengan permintaan saat ini$_SESSION
- Variabel sesi disimpan secara internal oleh PHP$_REQUEST
- Biasanya kombinasi dari$_GET
dan$_POST
, tetapi kadang-kadang$_COOKIES
. Konten ditentukan olehrequest_order
arahan dalamphp.ini
.$_ENV
- Variabel lingkungan dari skrip saat inisumber