Saya melihat sumber Drupal 7, dan saya menemukan beberapa hal yang belum pernah saya lihat sebelumnya. Saya melakukan beberapa pencarian awal di manual php, tetapi tidak menjelaskan contoh-contoh ini.
Apa yang dilakukan kata kunci static
terhadap variabel di dalam fungsi?
function module_load_all($bootstrap = FALSE) {
static $has_run = FALSE
Jawaban:
Itu membuat fungsi mengingat nilai variabel yang diberikan (
$has_run
dalam contoh Anda) di antara beberapa panggilan.Anda dapat menggunakan ini untuk tujuan yang berbeda, misalnya:
Dalam contoh ini,
if
hanya akan dijalankan sekali. Bahkan jika beberapa panggilan kedoStuff
akan terjadi.sumber
$cache
menjadinull
pada panggilan berikutnya, bukan?$cache
hanya akan disetel ulang di antara permintaan. Jadi ya, itu tidak akan diatur ulang pada panggilan berikutnya dalam permintaan yang sama (atau eksekusi skrip).if
pemeriksaan kondisi$cache === null
akan dijalankan setiap kali fungsi ini dipanggil, tidak dipikirkan jika kode blok$cache = '..'
akan dieksekusi.Sepertinya tidak ada yang menyebutkan sejauh ini, bahwa variabel statis di dalam instance berbeda dari kelas yang sama tetap statusnya. Jadi berhati-hatilah saat menulis kode OOP.
Pertimbangkan ini:
Jika Anda ingin variabel statis mengingat statusnya hanya untuk instance kelas saat ini, Anda sebaiknya tetap menggunakan properti kelas, seperti ini:
sumber
Diberikan contoh berikut:
Panggilan pertama
akan menampilkan
10
, lalu$v
menjadi20
. Variabel$v
tidak dikumpulkan sampah setelah fungsi berakhir, karena ini adalah variabel statis (non-dinamis). Variabel akan tetap dalam ruang lingkupnya sampai skrip benar-benar berakhir.Oleh karena itu, panggilan berikut ini
kemudian akan menampilkan
20
, dan kemudian disetel$v
menjadi15
.sumber
Statis bekerja dengan cara yang sama seperti di kelas. Variabel dibagikan di semua contoh fungsi. Dalam contoh khusus Anda, setelah fungsi dijalankan, $ has_run disetel ke TRUE. Semua fungsi yang berjalan di masa mendatang akan memiliki $ has_run = TRUE. Ini sangat berguna dalam fungsi rekursif (sebagai alternatif untuk meneruskan hitungan).
Lihat http://php.net/manual/en/language.variables.scope.php
sumber
variabel statis dalam suatu fungsi berarti bahwa tidak peduli berapa kali Anda memanggil fungsi tersebut, hanya ada 1 variabel.
sumber
Untuk memperluas jawaban Yang
Jika Anda memperluas kelas dengan variabel statis, masing-masing kelas yang diperluas akan menyimpan statis yang direferensikan "sendiri" yang dibagikan di antara instance.
keluaran:
http://ideone.com/W4W5Qv
sumber
Di dalam fungsi,
static
berarti variabel akan mempertahankan nilainya setiap kali fungsi dipanggil selama masa pemuatan halaman.Oleh karena itu dalam contoh yang Anda berikan, jika Anda memanggil suatu fungsi dua kali, jika disetel
$has_run
ketrue
, maka fungsi tersebut akan dapat mengetahui bahwa fungsi tersebut sebelumnya telah dipanggil karena$has_run
akan tetap sama dengantrue
saat fungsi dimulai untuk kedua kalinya.Penggunaan
static
kata kunci dalam konteks ini dijelaskan dalam manual PHP di sini: http://php.net/manual/en/language.variables.scope.phpsumber