Saya sangat senang membaca tentang fungsi anonim di php, yang memungkinkan Anda mendeklarasikan variabel yang berfungsi lebih mudah daripada yang dapat Anda lakukan dengan create_function . Sekarang saya bertanya-tanya apakah saya memiliki fungsi yang dilewatkan variabel, bagaimana cara memeriksanya untuk menentukan apakah itu sebuah fungsi? Belum ada fungsi is_function (), dan ketika saya melakukan var_dump dari variabel yang merupakan fungsi ::
$func = function(){
echo 'asdf';
};
var_dump($func);
Saya mengerti ini:
object(Closure)#8 (0) { }
Ada pemikiran tentang cara memeriksa apakah ini suatu fungsi?
php
anonymous-function
Jage
sumber
sumber
Anda dapat menggunakan
function_exists
untuk memeriksa apakah ada fungsi dengan nama yang diberikan. Dan untuk menggabungkannya dengan fungsi anonim, coba ini:function is_function($f) { return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure)); }
sumber
is_object()
daninstanceof Closure
merupakan cara yang jauh lebih kuat untuk memeriksa hal ini!Jika Anda hanya ingin memeriksa apakah variabel adalah fungsi anonim, dan bukan string atau larik yang dapat dipanggil, gunakan
instanceof
.$func = function() { echo 'asdf'; }; if($func instanceof Closure) { // Will be true. }
Fungsi anonim (dari jenis yang ditambahkan di PHP 5.3) selalu merupakan instance
Closure
kelas, dan setiap instanceClosure
kelas adalah fungsi anonim.Ada jenis hal lain di PHP yang bisa dianggap sebagai fungsi, dan itu adalah objek yang menerapkan
__invoke
metode ajaib. Jika Anda ingin memasukkannya (sambil tetap mengecualikan string dan array), gunakanmethod_exists($func, '__invoke')
. Ini masih akan mencakup closure, karena closure diimplementasikan__invoke
untuk konsistensi.sumber
is_callable()
akan mencoba menemukan metode untuk memanggil berdasarkan string atau larik yang diteruskan, yang mungkin memuat kelas secara otomatis dan mungkin bukan perilaku yang Anda harapkan / butuhkan.function is_function($f) { return is_callable($f) && !is_string($f); }
sumber
Dalam php callable yang valid dapat berupa fungsi, nama fungsi (string) dan array bentuk
['className', 'staticMethod']
atau[$object, 'method']
, jadi untuk mendeteksi hanya fungsi yang perlu mengecualikan string dan array:function isFunction($callable) { return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable); }
sumber