Dalam PHP, fungsi tanpa nama ialah fungsi yang ditakrifkan pada masa jalan tanpa menyatakan nama fungsi. Fungsi tanpa nama boleh diberikan kepada pembolehubah, diluluskan sebagai argumen kepada fungsi lain, atau dikembalikan sebagai nilai pulangan bagi fungsi lain. Penutupan ialah fungsi tanpa nama yang mengandungi pembolehubah skop luaran yang boleh digunakan atau diubah suai di dalam fungsi. Mekanisme ini menjadikan fungsi dalam PHP lebih fleksibel dan berkuasa.
Sintaks asas bagi fungsi tanpa nama adalah seperti berikut:
$functionName = function($arg1, $arg2, ...) { // function body };
Dalam sintaks ini, $functionName ialah pembolehubah penunjuk yang menunjuk ke fungsi tanpa nama. Kita boleh memanggil fungsi tanpa nama melalui pembolehubah ini sama seperti memanggil fungsi biasa. $arg1, $arg2, ... mewakili parameter fungsi. Di dalam badan fungsi, kita boleh menggunakan parameter ini untuk pengiraan dan pemprosesan, dan akhirnya mengembalikan hasil yang diperlukan. Sebagai contoh, kod berikut mentakrifkan penambahan fungsi tanpa nama yang mengira jumlah dua nombor dan mengembalikan hasilnya:
$add = function($a, $b) { return $a + $b; }; echo $add(2, 3); // 输出5
Fungsi tanpa nama boleh dihantar sebagai argumen kepada fungsi lain. Sebagai contoh, kita boleh menggunakan fungsi array_map untuk menambah 1 pada elemen dalam tatasusunan:
$arr = [1, 2, 3]; $newArr = array_map(function($item) { return $item + 1; }, $arr); print_r($newArr); // 输出 [2, 3, 4]
Dalam contoh ini, kami menggunakan fungsi array_map untuk melaksanakan fungsi tanpa nama pada setiap elemen dalam tatasusunan $arr. Fungsi tanpa nama menambah 1 pada elemen tatasusunan dan mengembalikannya, akhirnya menghasilkan tatasusunan baharu $newArr.
Penutupan ialah fungsi tanpa nama yang boleh merujuk pembolehubah dalam skop luar. Pembolehubah ini boleh dihantar sebagai parameter kepada penutupan, atau ia boleh digunakan terus di dalam penutupan dan dipanggil "pembolehubah penutupan".
Sebagai contoh, kod berikut mentakrifkan fungsi penutupan yang mengumpul parameter yang dihantar dan menyimpan hasilnya dalam pembolehubah penutupan $count:
$sum = function($num) use(&$count) { $count += $num; }; $count = 0; $sum(1); $sum(2); echo $count; // 输出3
Dalam contoh ini, Kami mentakrifkan fungsi penutupan $ jumlah dan secara dalaman merujuk pembolehubah $count dalam skop luar. Dalam fungsi penutupan, kami mengumpul parameter yang diluluskan $num dan menyimpan hasilnya dalam $count. Oleh kerana pembolehubah $count ditakrifkan di luar fungsi, kita perlu merujuknya menggunakan pernyataan penggunaan dan menghantarnya sebagai parameter fungsi penutupan.
Apabila menggunakan fungsi penutupan, anda perlu ambil perhatian bahawa kitaran hayat pembolehubah penutupan akan wujud bersama-sama dengan kitaran hayat fungsi penutupan, yang mungkin menyebabkan beberapa masalah. Sebagai contoh, dalam kod berikut, kami mentakrifkan tatasusunan $funcs dan laksanakan setiap fungsi dengan menggelung melalui tatasusunan:
$funcs = []; for($i = 0; $i < 5; $i++) { $funcs[$i] = function() use($i) { return $i; }; } foreach($funcs as $func) { echo $func(); }
Output yang dijangkakan hendaklah "01234", tetapi output sebenar ialah "44444" . Ini kerana hanya terdapat satu pembolehubah $i dirujuk dalam fungsi penutupan, dan semua fungsi yang ditakrifkan dalam tatasusunan $funcs merujuk pembolehubah yang sama, dan akhirnya mengembalikan nilai akhir $i, 4. Untuk mengelakkan ini, kita boleh menggunakan nama pembolehubah yang berbeza dan bukannya $i. Sebagai contoh, kita boleh menggunakan pembolehubah $j untuk menggantikan $i untuk menyelesaikan masalah ini:
$funcs = []; for($i = 0; $i < 5; $i++) { $j = $i; $funcs[$i] = function() use($j) { return $j; }; } foreach($funcs as $func) { echo $func(); }
Hasil keluaran kali ini ialah "01234" yang dijangkakan. Kami menggunakan $j untuk menggantikan pembolehubah $i yang dirujuk dalam fungsi penutupan, supaya setiap fungsi penutupan mempunyai pembolehubah penutupan bebasnya sendiri.
Ringkasnya, fungsi dan penutupan tanpa nama menjadikan fungsi dalam PHP lebih fleksibel dan serba boleh. Menggunakan fungsi dan penutupan tanpa nama, kami boleh mentakrif dan menggunakan fungsi dengan lebih mudah serta melaksanakan fungsi dan algoritma yang lebih kompleks. Pada masa yang sama, kita juga perlu memberi perhatian kepada kitaran hayat dan skop pembolehubah penutupan untuk mengelakkan keputusan yang tidak dijangka.
Atas ialah kandungan terperinci Fungsi dan penutupan tanpa nama dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!