Saya perhatikan bahwa saya dapat menggunakan salah satu Closure
atau Callable
sebagai petunjuk jenis jika kami mengharapkan beberapa fungsi panggilan balik untuk berjalan. Sebagai contoh:
function callFunc1(Closure $closure) {
$closure();
}
function callFunc2(Callable $callback) {
$callback();
}
$function = function() {
echo 'Hello, World!';
};
callFunc1($function); // Hello, World!
callFunc2($function); // Hello, World!
Pertanyaan:
Apa bedanya di sini? Dengan kata lain kapan digunakan Closure
dan kapan digunakan Callable
ATAU mereka melayani tujuan yang sama?
["Foo", "bar"]
untukFoo::bar
atau[$foo, "bar"]
untuk$foo->bar
.callFunc1(Closure::fromCallable("xy"))
. wiki.php.net/rfc/closurefromcallableClosure
+Closure::fromCallable
, karena string atau array seperticallable
selalu aneh.Closure
(fungsi anonim) sebagai lawancallable
, adalah untuk mencegah akses di luar ruang lingkup fungsi yang disebut. Misalnya ketika Anda memilikiprivate method
Anda tidak ingin diakses oleh seseorang yang menyalahgunakancallable
. Lihat: 3v4l.org/7TSf2Perbedaan utama di antara mereka adalah bahwa a
closure
adalah kelas dancallable
satu jenis .Itu
callable
Tipe menerima apa pun yang bisa disebut :Di mana
closure
akan hanyamenerima fungsi anonim. Perhatikan bahwa dalam PHP versi 7.1 Anda dapat mengkonversi fungsi untuk penutupan seperti:Closure::fromCallable('functionName')
.Contoh:
Jadi mengapa menggunakan
closure
overcallable
?Ketatnya karena
closure
merupakan objek yang memiliki beberapa metode tambahan:call()
,bind()
danbindto()
. Mereka memungkinkan Anda untuk menggunakan fungsi yang dideklarasikan di luar kelas dan menjalankannya seolah-olah itu di dalam kelas.Anda tidak ingin memanggil metode pada fungsi normal karena itu akan memunculkan kesalahan fatal. Jadi untuk menghindari itu Anda harus menulis sesuatu seperti:
Untuk melakukan ini, periksa setiap saat tidak ada gunanya. Jadi jika Anda ingin menggunakan metode-metode tersebut nyatakan bahwa argumennya adalah a
closure
. Kalau tidak, gunakan saja yang normalcallback
. Cara ini; Kesalahan muncul pada pemanggilan fungsi alih-alih kode Anda sehingga membuatnya lebih mudah untuk didiagnosis.Di samping catatan: The
closure
class tidak dapat diperpanjang sebagai yang akhir .sumber
callable
di namespace apa pun.Perlu disebutkan bahwa ini tidak akan berfungsi untuk versi PHP 5.3.21 hingga 5.3.29.
Di salah satu versi itu Anda akan mendapatkan output seperti:
Seseorang dapat mencobanya menggunakan https://3v4l.org/kqeYD#v5321
Salam Hormat,
sumber
callable
diperkenalkan di PHP 5.4. Sebelum itu PHP mengharapkan sebuah instance dari kelas bernamacallable
, sama seperti jika Anda sudah ditentukan petunjuk untukPDO
,DateTime
, atau\My\Random\ClassName
.