class Test
{
functionaa(callable$a,callable$b){
return$a(1,2)+$b(2,3);}functiona(){
returnfunction($a,$b){
return$a+$b;};}functionb(){
returnfunction($a,$b){
return$a*$b;};}}$obj=newTest();$ts=$obj->aa($obj->a(),$obj->b());var_dump($ts);
函数返回匿名函数
class Test
{
functionaa(callable$a,callable$b){
$sum=$a(1,3);$mul=$b(2,3);returnfunction()use($sum,$mul){
return$sum+$mul;};}functiona(){
returnfunction($a,$b){
return$a+$b;};}functionb(){
returnfunction($a,$b){
return$a*$b;};}}$obj=newTest();$ts=$obj->aa($obj->a(),$obj->b());var_dump($ts());
使用__invoke方式,很多框架中核心代码存在这种调用方式
class Test
{
functionaa(callable$a,callable$b){
returnfunction()use($a,$b){
returnnewOne($a,$b);};}functiona(){
returnfunction($a,$b){
return$a+$b;};}functionb(){
returnfunction($a,$b){
return$a*$b;};}}classOne{
public$a;public$b;publicfunction__construct(callable$a,callable$b){
$this->a=$a;$this->b=$b;}publicfunction__invoke(){
$a=$this->doa();$b=$this->dob();return$a+$b;}publicfunctiondoa(){
returncall_user_func($this->a,'4','2');}publicfunctiondob(){
returncall_user_func($this->b,'2','3');}}$obj=newTest();$ts=$obj->aa($obj->a(),$obj->b());$ty=$ts();var_dump($ty());//12