Memahami Scope dalam CFML
Panduan scope CFML: senarai variables, session, application, request, form dan url, jadual hayat dan skop, perangkap kebocoran memori, dan amalan selamat.

Kandungan
Memahami Scope dalam CFML
Penulis: Thalhah · Tarikh: 16 Oktober 2026
Scope dalam CFML menentukan di mana dan berapa lama sesuatu pemboleh ubah wujud serta siapa yang boleh membacanya. Memahami scope ialah asas untuk menulis kod yang boleh diramal, mengelakkan kebocoran data antara pengguna, dan menghalang kebocoran memori dalam aplikasi yang berjalan lama. Artikel ini menyenaraikan setiap scope, hayat dan skopnya, cara mengaksesnya, dan amalan selamat yang patut diikuti. Contoh paling mudah: pemboleh ubah dalam variables hilang selepas permintaan selesai, manakala nilai dalam session kekal untuk pengguna itu sahaja.
Apa Itu Scope
Scope ialah bekas berstruktur yang menyimpan pemboleh ubah dan menentukan jangka hayatnya. Sesetengah scope hidup hanya dalam satu fungsi, sesetengah sepanjang satu permintaan HTTP, dan sesetengah berterusan merentasi permintaan seperti sesi pengguna atau seluruh pelayan. Apabila anda menulis variables.nama, anda secara eksplisit memberitahu Lucee scope mana yang anda maksudkan.
Tanpa pemahaman ini, mudah tersilap menyimpan data peribadi pengguna dalam scope yang dikongsi, atau menyimpan objek besar dalam scope yang tidak pernah dibersihkan.
Scope Tempatan dan Fungsi
Scope paling dekat dengan kod ialah local, arguments, variables, this dan thread. Scope local wujud hanya dalam satu fungsi dan diisytiharkan dengan var. Scope arguments menyimpan parameter yang dihantar ke fungsi atau kaedah CFC dan boleh dirujuk mengikut nama atau kedudukan. Scope variables ialah scope peribadi bagi komponen atau halaman, manakala this ialah scope awam komponen yang boleh dibaca dari luar.
component {
public numeric function tambah(required numeric a, required numeric b) {
var hasil = a + b; // local
return hasil;
}
}
Dalam contoh di atas, a dan b berada dalam arguments, manakala hasil berada dalam local. Untuk perincian tentang komponen, baca panduan fungsi dan komponen CFC.
Scope Permintaan
Scope permintaan hidup sepanjang satu permintaan HTTP dan boleh diakses daripada semua templat, CFC dan tag tersuai dalam permintaan itu. Yang utama ialah request, url, form dan cgi.
var id = url.id; // daripada rentetan pertanyaan (GET)
var nama = form.nama; // daripada data borang (POST)
request.userData = muatPengguna(id);
Scope cgi memegang pemboleh ubah persekitaran yang dijana pelayan web seperti cgi.remote_addr dan cgi.http_user_agent. Nilai dalam cgi berbeza mengikut pelayan dan pelayar. Lucee secara lalai menghuraikan medan borang dan parameter url bertitik menjadi struktur, satu tingkah laku yang boleh dimatikan melalui tetapan this.formUrlAsStruct.
Scope Berterusan
Scope berterusan kekal merentasi permintaan. session menyimpan data untuk satu pengguna sepanjang sesinya, application menyimpan data yang dikongsi seluruh aplikasi, server menyimpan data untuk semua aplikasi pada satu pelayan, cookie menyimpan nilai kecil pada pelayar, dan client menyimpan data klien secara berterusan tetapi jarang digunakan dalam aplikasi moden.
session.userId = 123; // khusus kepada pengguna semasa
application.settings = muatTetapan(); // dikongsi semua pengguna
cookie.terakhirDilawati = now(); // dihantar ke pelayar
Untuk pengurusan sesi yang mendalam, baca panduan pengurusan sesi. Konfigurasi masa hayat sesi dan aplikasi ditetapkan dalam Application.cfc.
Jadual Hayat dan Skop
Jadual berikut meringkaskan scope utama, jangka hayatnya, dan keterlihatan datanya:
| Scope | Jangka hayat | Keterlihatan |
|---|---|---|
| local | Satu fungsi | Fungsi sahaja |
| arguments | Satu fungsi | Fungsi sahaja |
| variables | Satu permintaan atau tika komponen | Halaman atau komponen |
| this | Tika komponen | Awam, boleh dibaca luar |
| request | Satu permintaan HTTP | Semua kod dalam permintaan |
| url | Satu permintaan HTTP | Data GET |
| form | Satu permintaan HTTP | Data POST |
| cgi | Satu permintaan HTTP | Pemboleh ubah pelayan |
| cookie | Sehingga tamat tempoh | Pelayar pengguna |
| session | Sepanjang sesi pengguna | Satu pengguna |
| application | Sepanjang hayat aplikasi | Semua pengguna aplikasi |
| server | Sepanjang hayat pelayan | Semua aplikasi |
Cara Mengakses dan Scope Cascading
Apabila anda merujuk pemboleh ubah tanpa scope, Lucee mencari dalam scope terdekat mengikut susunan tertentu. Tingkah laku ini dipanggil scope cascading. Dalam fungsi, carian bermula dengan local, diikuti arguments, kemudian variables. Mod lalai ialah standard, yang turut menyemak cgi, url, form dan cookie selepas variables.
Mod ini boleh diubah melalui pentadbir, .CFConfig.json, atau Application.cfc:
component {
this.scopeCascading = "strict";
}
Mod strict mengehadkan carian kepada local, arguments dan variables sahaja, dan disyorkan untuk prestasi serta keselamatan kerana ia menghapuskan kekaburan. Ada juga mod small, yang mengehadkan carian kepada local, arguments, variables, url dan form. Menulis scope secara eksplisit juga menjadikan kod lebih mudah dibaca dan mengelakkan Lucee mengambil pemboleh ubah daripada scope yang tidak disangka.
Satu perincian tambahan ialah scope pertanyaan. Di dalam gelung cfloop atau cfoutput yang mengulang pertanyaan, Lucee menyemak lajur pertanyaan sebelum scope variables. Carian ini boleh dimatikan dengan this.searchResults = false dalam Application.cfc untuk prestasi yang lebih baik.
Perangkap Kebocoran Memori dalam Application Scope
Scope application hidup sepanjang hayat aplikasi dan dikongsi oleh semua pengguna, jadi sebarang objek yang anda letakkan di sana kekal dalam memori sehingga aplikasi dimulakan semula. Ini ialah punca kebocoran memori yang lazim.
Perangkap paling kerap ialah menyimpan pertanyaan atau struktur besar yang berkembang tanpa had, contohnya cache buatan sendiri yang menambah entri tetapi tidak pernah membuangnya. Jika anda mesti menyimpan data berkongsi, letakkan had yang jelas atau gunakan mekanisme caching bawaan Lucee yang mengurus penyingkiran secara automatik. Untuk pendekatan caching yang betul, baca panduan caching dan prestasi.
Satu lagi kesilapan ialah menyimpan data khusus pengguna dalam application dan bukannya session. Ini bukan sahaja membazir memori, malah mendedahkan data seorang pengguna kepada pengguna lain, satu isu keselamatan serius. Pastikan data per pengguna sentiasa duduk dalam session.
Amalan Selamat
Beberapa amalan berikut mengurangkan kebanyakan masalah scope:
- Sentiasa gunakan prefix scope yang jelas dan elakkan pemboleh ubah tanpa prefix.
- Gunakan
varataulocaluntuk setiap pemboleh ubah dalam fungsi supaya ia tidak bocor ke scope yang lebih luas. - Jangan simpan objek kompleks dalam
session, simpan ID atau nilai kecil sahaja. - Gunakan
applicationhanya untuk data yang benar-benar global dan letakkan had pada saiznya. - Elakkan menyimpan data peribadi pengguna dalam
application,serverataucookie. - Pertimbangkan mod
strictuntuk scope cascading supaya kod lebih selamat dan boleh diramal.
Scope juga berkait rapat dengan keselamatan, kerana data pengguna daripada url dan form tidak boleh dipercayai tanpa pengesahan. Untuk melindungi aplikasi anda, baca panduan keselamatan web XSS dan CSRF.
Soalan Lazim (FAQ)
Apakah beza session dan application scope?
Session scope ialah per pengguna, jadi setiap pengguna ada datanya sendiri, manakala application scope dikongsi oleh semua pengguna untuk seluruh aplikasi.
Berapa lama pemboleh ubah variables wujud?
Hanya sepanjang permintaan HTTP semasa atau sepanjang tika komponen, dan ia tidak kekal antara permintaan.
Apakah maksud scope cascading strict?
Mod strict mengehadkan carian pemboleh ubah tanpa prefix kepada local, arguments dan variables sahaja, yang lebih selamat dan pantas tetapi memerlukan setiap pemboleh ubah mempunyai scope yang jelas.
Bolehkah saya menyimpan data pengguna dalam application scope?
Tidak patut. Application scope dikongsi semua pengguna, jadi data peribadi akan bocor antara pengguna dan membazir memori. Gunakan session scope untuk data per pengguna.
Apakah punca kebocoran memori dalam application scope?
Menyimpan struktur atau cache yang berkembang tanpa had, dan menyimpan data yang sepatutnya per pengguna dalam scope yang dikongsi, kerana data application kekal sehingga aplikasi dimulakan semula.