Penafian: artikel ini tidak akan mengungkapkan apa pun wahyu kepada Anda dan tidak akan membuka mata ketiga, tetapi akan memungkinkan Anda untuk memahami pertanyaan yang tidak begitu jelas secara lebih rinci. Setidaknya ketika saya menulisnya, dia membantu saya dalam hal ini. Jika Anda adalah serigala berpengalaman dalam php, maka Anda tidak dapat membacanya, saya pikir itu tidak akan menyakiti orang yang berpengalaman untuk berjalan melalui mata mereka, menyegarkan mereka dalam memori, sehingga untuk berbicara, sisanya akan menjadi normal.
Jadi ...
Variabel statis dalam php adalah jenis variabel khusus yang dideklarasikan menggunakan kata kunci statis .
static $foo = 3;
Mereka berbeda dari variabel biasa dalam hal itu (nanti dalam artikel poin ini akan dipertimbangkan secara lebih rinci):
- hanya konstanta dan ekspresi konstan yang dapat ditetapkan
- masa pakai variabel statis tidak terbatas pada masa hidup ruang lingkup yang dideklarasikan
- dapat didefinisikan dalam skrip hanya sekali
- tidak hancur sampai akhir skrip
Sekarang sudah beres.
1. Hanya konstanta dan ekspresi konstan yang dapat ditetapkan
Ini berarti bahwa hasil operasi dari setiap fungsi atau metode tidak dapat ditugaskan ke variabel statis, atau secara umum apa pun yang belum diketahui pada tahap kompilasi. Artinya, iklan seperti itu tidak akan berfungsi
static $var = foo();
tetapi sangat mungkin
static $var = 'some str'; static $varInt = 3 + 5;
2. Masa hidup variabel statis tidak terbatas pada masa hidup lingkup di mana ia dinyatakan
Saya akan mencoba menjelaskan apa yang saya maksud di sini. Mungkin saya akan membuat beberapa ketidakakuratan dalam terminologi, tetapi saya akan mencoba untuk menyampaikan esensi seakurat mungkin. Bandingkan dengan variabel biasa. Jika suatu variabel dideklarasikan di dalam suatu fungsi, maka secara default itu adalah variabel lokal, yaitu, ia dideklarasikan dalam lingkup lokal (lingkup fungsi ini). Dalam hal ini, konteks fungsi ini akan menjadi cakupan lokal. Setelah fungsi bekerja dan mengembalikan hasilnya, cakupan atau konteksnya, dengan semua variabel di dalamnya, akan dihancurkan.
Jika kita mendeklarasikan variabel statis di dalam fungsi, maka ia juga dideklarasikan dalam lingkup lokal, tetapi konteksnya bukan lingkup lokal, tetapi fungsi itu sendiri.
(Selanjutnya, momen paling sulit untuk dijelaskan, saya hanya menyampaikan esensi, tanpa detail, bagaimana fungsi dinyatakan dalam php berapa banyak memori yang dialokasikan untuk mereka dan apa yang ada di memori ini). Ternyata begini, ketika suatu fungsi dipanggil, juru bahasa menciptakan ruang lingkup lokal untuk itu, di dalamnya semua variabel lokal dan fungsi dideklarasikan, dan mereka melekat padanya sebagai konteks mereka. Dengan mendeklarasikan variabel dalam lingkup lokal menggunakan statis, fungsi itu sendiri ditugaskan ke variabel ini sebagai konteks, dan variabel ini akan ada selama fungsi itu sendiri ada. Ini adalah sesuatu seperti js ketika suatu fungsi adalah objek tempat Anda dapat menetapkan properti dan metode yang berubah-ubah. Di sini juga, hanya fungsi dalam php yang bukan objek untuk php, tetapi untuk bahasa yang lebih rendah.
function echoStaticVar() { static $var = 0; $var++; var_dump($var); }; echoStaticVar();
Dapat dilihat bahwa setelah fungsi berakhir, kolektor tidak menghancurkan variabel $ var sebagaimana akan dengan variabel biasa.
Dan di sini adalah contoh yang akan menunjukkan dengan jelas bahwa variabel statis milik suatu fungsi (baik itu disimpan dalam suatu fungsi, atau konteksnya adalah suatu fungsi, jadi saya minta maaf saya tidak tahu bagaimana cara memberi nama dengan benar).
$one = function ($i) { static $var = 0; $var += $i; var_dump($var); }; $two = $one; $one(1);
Semuanya berfungsi seperti yang diharapkan, karena ketika menetapkan $ dua = $ satu; fungsi itu sendiri tidak disalin, tetapi hanya kedua variabel ini akan merujuk ke area memori yang sama. Dengan demikian, variabel statis $ var akan menjadi satu untuk $ satu dan $ dua
Kami mengubah contoh sedikit, yaitu, kami tidak menetapkan, tetapi kami mengkloning
$one = function ($i) { static $var = 0; $var += $i; var_dump($var); }; $two = clone($one); $one(1);
Sekarang ternyata $ satu dan $ dua tidak merujuk ke fungsi yang sama dengan satu variabel statis $ var, tetapi ke dua fungsi berbeda yang terletak di area memori yang berbeda dan masing-masing memiliki variabel statis $ var sendiri. Ini bukan poin yang sangat jelas, sehingga Anda bisa tersandung, jika Anda tentu saja menulis kode dalam gaya prosedural, yang mungkin sudah dianggap bentuk yang buruk, tetapi ini tidak akurat).
Apa yang dapat Anda lakukan dengan ini adalah contoh klasik dari penghitung panggilan fungsi.
Tetapi sehubungan dengan penyebaran OOP dalam bentuk ini, variabel statis jarang terjadi, karena pada dasarnya Anda harus beroperasi dengan kelas dan metode (saya akan menulis artikel terpisah tentang penerapan statis di dalamnya)
3. dapat didefinisikan dalam skrip hanya sekali
Ini berarti bahwa jika variabel statis sudah dideklarasikan, dan nilai diberikan padanya, penetapan selanjutnya tidak akan menimpa nilai yang sudah ditetapkan, tetapi akan mengembalikan yang sudah ada.
function staticVar($i) { static $var = 0; $var += $i; var_dump($var); }; staticVar(1);
Dapat dilihat bahwa jika variabel statis $ var setiap kali memiliki nilai yang ditugaskan kembali, maka kita akan selalu mendapatkan hasil 1. Tetapi karena tidak ditulis ulang ketika dipindahkan, kita mendapatkan apa yang kita dapatkan.
Benar, ada satu hal yang dapat merusak segalanya. Dalam kerangka satu fungsi (lebih tepatnya, pertama kali fungsi dipanggil), variabel tersebut dapat ditulis ulang sebanyak yang Anda suka (dalam kasus-kasus selanjutnya semuanya akan berfungsi seperti yang dinyatakan). Bagi saya, perilaku ini aneh dan lucu, terutama jika Anda bermain-main dengan contoh.
function staticVar($i) { static $var = 0; static $var = 5; $var += $i; var_dump($var); }; staticVar(1);
Di sini variabel $ var dalam panggilan pertama ke fungsi staticVar di baris pertama ditugaskan, kemudian ditimpa di baris kedua. Tapi sudah dalam panggilan lebih lanjut, baik di baris pertama maupun di baris kedua dia ditugaskan, tetapi mengembalikan apa yang sudah ada di panggilan sebelumnya
function staticVar($i) { static $var = 0;
Bahkan lebih aneh lagi pada panggilan pertama staticVar di baris pertama, itu ditugaskan, kemudian di baris kedua itu dipindahkan (tetapi tidak berhasil), maka tindakan penambahan dilakukan dengan itu, dan setelah itu, ketika mencoba untuk menetapkan kembali bahkan dalam panggilan fungsi pertama, itu mengembalikan yang sudah ada di artinya.
function staticVarWrong($i) { static $var = 0; static $var = 5; $var += $i; var_dump($var); };
Artinya, ternyata dalam metode yang hampir sama, perilaku yang berbeda. Selain itu, berdasarkan uraian tentang bagaimana variabel statis harus berperilaku, hasil yang benar diperoleh dalam staticVarRight . Dalam staticVarWrong ternyata (berdasarkan pada perilaku fungsi) bahwa pada baris kedua dari fungsi variabel telah didefinisikan ulang.
Ini sangat menghibur saya.
4. tidak dihancurkan sampai akhir skrip
Saya tidak melihat banyak gunanya menjelaskan hal ini, terutama karena semuanya jelas dari contoh. Ketika skrip sedang berjalan dan sementara ada fungsi yang menyatakan variabel statis, variabel ini ada.
Seperti yang direncanakan, ini adalah artikel pertama tentang statis , di depan OOP, bidang statis, metode.
Yah, tentu saja, jika itu setidaknya seseorang akan tertarik dan tidak sulit untuk disalahkan.