PHP匿名函数,回调函数,闭包的使用

自定义函数

  • 基本大部分的编程语言都有函数,函数也是编程语言的一个基础单元了,php中的自定义函数可分为无参函数,有参函数,无返回值,有返回值

无参函数

  • 见名知意即没有参数的函数
function aa()
{
    
    

    echo '无参函数';

}

有参函数

function bb($a,$b){
    
    
    
    echo $a+$b;
}

有返回值函数

function cc($a,$b){
    
    
    return $a+$b;
}

匿名函数

  • 匿名函数类似自定义函数,缺少函数名,可作为参数。调用匿名函数可赋值给一个变量,变量加()直接调用
function(){
    
    
    echo '匿名函数';
}
function($a){
    
    
    echo $a;
}
  • 匿名函数作为正常函数参数使用,下面我们得到的结果为3
function aa($a, $b)
{
    
    
    return $a() + $b();
}

$ts = aa(function () {
    
    
    return 1;
}, function () {
    
    
    return 2;
});

var_dump($ts);
  • 匿名函数作为参数并接收参数的方式
function bb($a, $b, $c)
{
    
    
    $sum = $a + $b;

    $mul = $c($sum, $a);

    return $sum + $mul;
}

$tu = bb(3, 3, function ($a, $b) {
    
    
    return $a * $b;
});

var_dump($tu);//24=3+3+(3+3)*3

闭包用法

  • 上面匿名函数的使用已经算的上闭包的用法了,做到了一个函数中传递参数进行其他的操作,看看在类中怎么使用
class Test
{
    
    
    function aa(callable $a, callable $b)
    {
    
    
        return $a(1, 2) + $b(2, 3);
    }

    function a()
    {
    
    
        return function (
            $a, $b
        ) {
    
    
            return $a + $b;
        };
    }

    function b()
    {
    
    
        return function ($a, $b) {
    
    
            return $a * $b;
        };
    }
}

$obj = new Test();

$ts = $obj->aa($obj->a(), $obj->b());

var_dump($ts);
  • 函数返回匿名函数
class Test
{
    
    
    function aa(callable $a, callable $b)
    {
    
    
        $sum = $a(1, 3);
        $mul = $b(2, 3);
        return function () use($sum,$mul) {
    
    
            return $sum + $mul;
        };
    }

    function a()
    {
    
    
        return function (
            $a, $b
        ) {
    
    
            return $a + $b;
        };
    }

    function b()
    {
    
    
        return function ($a, $b) {
    
    
            return $a * $b;
        };
    }
}

$obj = new Test();

$ts = $obj->aa($obj->a(), $obj->b());

var_dump($ts());
  • 使用__invoke方式,很多框架中核心代码存在这种调用方式
class Test
{
    
    
    function aa(callable $a, callable $b)
    {
    
    
        return function () use ($a, $b) {
    
    
            return new One($a, $b);
        };
    }

    function a()
    {
    
    
        return function (
            $a, $b
        ) {
    
    
            return $a + $b;
        };
    }

    function b()
    {
    
    
        return function ($a, $b) {
    
    
            return $a * $b;
        };
    }
}

class One
{
    
    
    public $a;
    public $b;

    public function __construct(callable $a, callable $b)
    {
    
    
        $this->a = $a;
        $this->b = $b;
    }

    public function __invoke()
    {
    
    
        $a = $this->doa();
        $b = $this->dob();
        return $a + $b;
    }

    public function doa()
    {
    
    
        return call_user_func($this->a, '4', '2');
    }

    public function dob()
    {
    
    
        return call_user_func($this->b, '2', '3');
    }
}

$obj = new Test();

$ts = $obj->aa($obj->a(), $obj->b());
$ty = $ts();

var_dump($ty());//12

Guess you like

Origin blog.csdn.net/weixin_43674113/article/details/121400519