Dengan keluaran PHP 7, banyak ciri dan peningkatan baharu membawa prestasi dan kebolehbacaan yang lebih baik. Walau bagaimanapun, apabila menggunakan pembolehubah statik, kita mungkin menghadapi masalah yang tidak boleh diberikan kepada tatasusunan. Dalam artikel ini, kami akan melihat dengan lebih dekat masalah ini dan cara menyelesaikannya.
Sebelum PHP 7, kami boleh menyimpan sebarang jenis nilai dalam pembolehubah statik, termasuk tatasusunan. Contohnya:
function test() { static $arr = array('a', 'b', 'c'); print_r($arr); } test(); // 输出 ['a', 'b', 'c']
Walau bagaimanapun, dalam PHP 7, kod ini akan mengeluarkan ralat berikut:
Fatal error: Constant expression contains invalid operations in /path/to/file.php on line 2
Ini kerana PHP 7 mempunyai cara yang lebih baik untuk memulakan pembolehubah statik sekatan. Kini, kita hanya boleh menggunakan pemalar untuk memulakan pembolehubah statik.
Tetapi mengapa kita tidak boleh menggunakan tatasusunan untuk memulakan pembolehubah statik dalam PHP 7? Ini kerana dalam PHP 7, permulaan pembolehubah statik dilakukan pada masa penyusunan, bukan pada masa jalan. Ini bermakna, pada masa penyusunan, PHP tidak mengetahui panjang tatasusunan dan nilai elemen dan oleh itu tidak dapat menentukan nilai awal pembolehubah statik. Dalam erti kata lain, PHP memerlukan pemalar yang pasti untuk memulakan pembolehubah statik, manakala tatasusunan bukan pemalar.
Untuk menyelesaikan masalah ini, kita boleh menggunakan pemalar kelas dan bukannya tatasusunan. Memandangkan pemalar kelas dihuraikan dan dinilai pada masa penyusunan, ia boleh digunakan untuk memulakan pembolehubah statik. Contohnya:
class Test { const ARRAY = array('a', 'b', 'c'); public function test() { static $arr = self::ARRAY; print_r($arr); } } $test = new Test(); $test->test(); // 输出 ['a', 'b', 'c']
Dalam contoh ini, kami mentakrifkan pemalar kelas bernama ARRAY
dan menggunakannya sebagai nilai untuk memulakan pembolehubah statik $arr
. Kami menggunakan self::
untuk merujuk kepada pemalar kelas kerana ia tergolong dalam kelas, bukan objek.
Selain menggunakan pemalar kelas, kami juga boleh menggunakan kelas tanpa nama yang diperkenalkan dalam PHP 7 untuk memulakan pembolehubah statik. Kelas tanpa nama ialah kelas tanpa nama yang boleh dibuat dan dijadikan instantiated semasa runtime. Ia biasanya digunakan untuk mencipta objek dan penutupan yang mudah.
Berikut ialah contoh menggunakan kelas tanpa nama untuk memulakan pembolehubah statik:
function test() { static $arr; if (!isset($arr)) { $arr = (new class { public $items = array('a', 'b', 'c'); })->items; } print_r($arr); } test(); // 输出 ['a', 'b', 'c']
Dalam contoh ini, kami menggunakan kelas tanpa nama untuk mencipta objek dengan hanya satu sifat items
. Kami menggunakan $arr
untuk menyimpan harta items
objek ini dan menggunakannya sebagai nilai awal pembolehubah statik. Memandangkan kelas tanpa nama dicipta pada masa jalan, kita boleh menggunakan tatasusunan untuk memulakan pembolehubah statik.
Ringkasnya, walaupun PHP 7 mempunyai sekatan yang lebih ketat dalam cara untuk memulakan pembolehubah statik, kami boleh menggunakan pemalar kelas dan kelas tanpa nama untuk menyelesaikan masalah tidak dapat menetapkan tatasusunan. Teknik ini digunakan bukan sahaja untuk pembolehubah statik, tetapi juga kepada senario lain yang memerlukan nilai awal yang tetap.
Atas ialah kandungan terperinci Apa yang perlu dilakukan jika pembolehubah statik php7 tidak boleh diberikan kepada tatasusunan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!