PHP中的回调函数和匿名函数
枕边书
常怀敬畏之心。
PHP中的回调函数和匿名函数
前言
前段时间在公司忙成狗,每天下班回家都觉得脑袋沉沉的。周六周日也各种事,不想动手码字,博客也就拖下来了,预感最近一段时间不会太忙了,开始有空写一写,总结分享一下收获,欢迎关注。
回调函数和匿名函数
回调函数、闭包在JS中并不陌生,JS使用它可以完成事件机制,进行许多复杂的操作。PHP中却不常使用,今天来说一说PHP中中的回调函数和匿名函数。
回调函数
回调函数:Callback (即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。
通俗的解释就是把函数作为参数传入进另一个函数中使用;PHP中有许多 “需求参数为函数” 的函数,像array_map,usort,call_user_func_array之类,他们执行传入的函数,然后直接将结果返回主函数。好处是函数作为值使用起来方便,而且代码简洁,可读性强。
匿名函数:
匿名函数,顾名思义,是没有一个确定函数名的函数,PHP将匿名函数和闭包视作相同的概念(匿名函数在PHP中也叫作闭包函数)。它的用法,当然只能被当作变量来使用了。
PHP中将一个函数赋值给一个变量的方式有四种:
我们经常会用到的:函数在外部定义/或PHP内置,直接将函数名作为字符串参数传入。注意:如果是类静态函数的话以CLASS::FUNC_NAME的方式传入。
使用create_function($args, $func_code);创建函数,会返回一个函数名。 $func_code为代码体,$args为参数字符串,以','分隔;
直接赋值:$func_name = function($arg){statement};
直接使用匿名函数,在参数处直接定义函数,不赋给具体的变量值;
第一种方式因为是平常所用,不再多提;第二种类似eval()方法的用法,也被PHP官方列为不推荐使用的方式,而且其定义方式太不直观,我除了测试外,也没有在其他地方使用过,也略过不提。在这里重点说一下第三种和第四种用法;
后两种创建的函数就被称为匿名函数,也就是闭包函数, 第三种赋值法方式创建的函数非常灵活,可以通过变量引用。可以用 is_callable($func_name) 来测试此函数是否可以被调用, 也可以通过$func_name($var)来直接调用;而第四种方式创建的函数比较类似于JS中的回调函数,不需要变量赋值,直接使用;
另外要特别介绍的是 use 关键词,它可以在定义函数时,用来引用父作用域中的变量;用法为 function($arg) use($outside_arg) {function_statement} 。其中$outside_arg 为父作用域中的变量,可以在function_statement使用。
这种用法用在回调函数“参数值数量确定”的函数中。 如usort需求$callback的参数值为两项,可是我们需要引入别的参数来影响排序怎么办呢?使用use()关键词就很方便地把一个新的变量引入$callback内部使用了。
array_map/array_filter/array_walk:
把这三个函数放在一块是因为这三个函数在执行逻辑上比较类似,类似于下面的代码:
$result = []; foreach($vars as $key=>$val){ $item = callback(); $result[] = $item; } return $result;
array_walk($vars, $callback)
其callback应如下:
$callback = function(&$val, $key[, $arg]){ doSomething($val); }
array_walk返回执行是否成功,是一个布尔值。对$value添加引用符号可以在函数内改变$value值,以达到改变$vars数组的效果。由于其$callback对参数数量要求为两项,array_walk不能传入strtolower/array_filter之类的$callback,若想实现类似功能,可以使用接下来要说的array_map()。
array_walk_recursive($arr, $callback);
返回值和执行机制类似于array_walk;
其callback同array_walk,不同的是,如果$val是数组,函数会递归地向下处理$val;需要注意的是这样的话$val为数组的$key就会被忽略掉了。
array_filter($vars, $callback, $flag);
其$callback类似于:
$callback = function($var){ return true or false; }
array_filter会过滤掉$callback执行时返回为false的项目,array_filter返回过滤完成后的数组。
第三个参数 $flag决定其callback形参$var的值,不过这个可能是PHP高版本的特性,我的PHP5.5.3不支持,大家可以自行测试。默认传入数组每项的value,当flag为ARRAY_FILTER_USE_KEY传入数组每项的key,ARRAY_FILTER_USE_BOTH传入键和值;
array_map($callback, &$var_as [,$var_bs...]);
其$callback类似于:
$callback = function($var_a[, $var_b...]){ doSomething($var_a, $var_b); }
返回$var_as经过callback处理后的数组(会改变原数组);如果有多个数组的时候将两个数组同样顺序的项目传入处理,执行次数为参数数组中项目最多的个数;
usort/array_reduce
把这两个函数放在一块,因为他们的执行机制都有些特殊。
usort(&$vars, $callback)
$callback应该如下:
callback = function($left, $right){ $res = compare($left, $right); return $res; }
usort返回执行成功与否,bool值。用户自定义方法 比较$left 和 $right,其中$left和$right是$vars中的任意两项;
$left > $right时返回 正整数, $left < $right时返回 负整数, $left = $right时返回0;
$vars中的元素会被取出会被由小到大升序排序。 想实现降序排列,将$callback的返回值反一下就行了。
array_reduce($vars ,$callable [, mixed $initial = NULL])
$callback应该如下:
$callback = function($initial, $var){ $initial = calculate($initail, $var); return $initial; }
初始值$initial默认为null,返回经过迭代后的initial;一定要将$initial返回,这样才能不停地改变$initial的值,实现迭代的效果。
这里顺便说一下map和reduce的不同:
map:将数组中的成员遍历处理,每次返回处理后的一个值,最后结果值为所有处理后值组成的多项数组;
reduce:遍历数组成员,每次使用数组成员结合初始值处理,并将初始值返回,即使用上一次执行的结果,配合下一次的输入继续产生结果,结果值为一项;
call_user_func/call_user_func_array
call_user_func[_array]($callback, $param)
$callback形如:
$callback = function($param){ $result = statement(); return $result; }
返回值多种,具体看$callback。
可用此函数实现PHP的事件机制,其实并不高深,在判断条件达成,或程序执行到某一步后 call_user_func()就OK了。这个我在之前的博客中也有介绍到:搭建自己的PHP框架心得(二)
总结
其实以上$callback不用单独定义并使用变量引用,使用上面说过的第四种函数定义方式,直接在函数内定义,使用‘完全’匿名函数就行了。 如:
usort($records, function mySortFunc($arg) use ($order){ func_statement; });
是不是逼格满满呢?
OK,介绍了几个用法~希望对大家有帮助,如果有问题,欢迎指出,如果您喜欢,可以点下推荐~

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

PHP dan Python masing -masing mempunyai kelebihan mereka sendiri, dan memilih mengikut keperluan projek. 1.PHP sesuai untuk pembangunan web, terutamanya untuk pembangunan pesat dan penyelenggaraan laman web. 2. Python sesuai untuk sains data, pembelajaran mesin dan kecerdasan buatan, dengan sintaks ringkas dan sesuai untuk pemula.

PHP digunakan secara meluas dalam e-dagang, sistem pengurusan kandungan dan pembangunan API. 1) e-dagang: Digunakan untuk fungsi keranjang belanja dan pemprosesan pembayaran. 2) Sistem Pengurusan Kandungan: Digunakan untuk penjanaan kandungan dinamik dan pengurusan pengguna. 3) Pembangunan API: Digunakan untuk Pembangunan API RESTful dan Keselamatan API. Melalui pengoptimuman prestasi dan amalan terbaik, kecekapan dan pemeliharaan aplikasi PHP bertambah baik.

PHP adalah bahasa skrip yang digunakan secara meluas di sisi pelayan, terutamanya sesuai untuk pembangunan web. 1.PHP boleh membenamkan HTML, memproses permintaan dan respons HTTP, dan menyokong pelbagai pangkalan data. 2.PHP digunakan untuk menjana kandungan web dinamik, data borang proses, pangkalan data akses, dan lain -lain, dengan sokongan komuniti yang kuat dan sumber sumber terbuka. 3. PHP adalah bahasa yang ditafsirkan, dan proses pelaksanaan termasuk analisis leksikal, analisis tatabahasa, penyusunan dan pelaksanaan. 4.Php boleh digabungkan dengan MySQL untuk aplikasi lanjutan seperti sistem pendaftaran pengguna. 5. Apabila debugging php, anda boleh menggunakan fungsi seperti error_reporting () dan var_dump (). 6. Mengoptimumkan kod PHP untuk menggunakan mekanisme caching, mengoptimumkan pertanyaan pangkalan data dan menggunakan fungsi terbina dalam. 7

PHP masih dinamik dan masih menduduki kedudukan penting dalam bidang pengaturcaraan moden. 1) kesederhanaan PHP dan sokongan komuniti yang kuat menjadikannya digunakan secara meluas dalam pembangunan web; 2) fleksibiliti dan kestabilannya menjadikannya cemerlang dalam mengendalikan borang web, operasi pangkalan data dan pemprosesan fail; 3) PHP sentiasa berkembang dan mengoptimumkan, sesuai untuk pemula dan pemaju yang berpengalaman.
