Tutorial Pasukan Lucee MY

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.

Memahami Scope dalam CFML
0
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:

ScopeJangka hayatKeterlihatan
localSatu fungsiFungsi sahaja
argumentsSatu fungsiFungsi sahaja
variablesSatu permintaan atau tika komponenHalaman atau komponen
thisTika komponenAwam, boleh dibaca luar
requestSatu permintaan HTTPSemua kod dalam permintaan
urlSatu permintaan HTTPData GET
formSatu permintaan HTTPData POST
cgiSatu permintaan HTTPPemboleh ubah pelayan
cookieSehingga tamat tempohPelayar pengguna
sessionSepanjang sesi penggunaSatu pengguna
applicationSepanjang hayat aplikasiSemua pengguna aplikasi
serverSepanjang hayat pelayanSemua 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:

  1. Sentiasa gunakan prefix scope yang jelas dan elakkan pemboleh ubah tanpa prefix.
  2. Gunakan var atau local untuk setiap pemboleh ubah dalam fungsi supaya ia tidak bocor ke scope yang lebih luas.
  3. Jangan simpan objek kompleks dalam session, simpan ID atau nilai kecil sahaja.
  4. Gunakan application hanya untuk data yang benar-benar global dan letakkan had pada saiznya.
  5. Elakkan menyimpan data peribadi pengguna dalam application, server atau cookie.
  6. Pertimbangkan mod strict untuk 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.

Sumber

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk