首页 编程语言 php

PHP中 closure and callable的差异

今天,分析下PHP中 closure and callable的差异。

在 PHP 中,闭包是一个匿名函数,可以分配给变量或作为参数传递给其他函数。这是一种动态创建函数的方法,无需使用关键字显式定义它们。function

闭包在以下情况下非常有用:您希望创建一个函数,该函数可以从其周围范围访问变量,即使在外部函数完成执行之后也是如此。此行为称为“关闭”变量。

下面是在 PHP 中创建和使用闭包的示例:

$greeting = function ($name) {
    echo "Hello, $name!";
};

$greeting('John'); // Output: Hello, John!

在上面的代码中,我们为变量分配了一个匿名函数。此函数接受一个参数,并使用该参数回显问候消息。$greeting$name

闭包通常在处理高阶函数时使用,例如 、 和 ,您可以在其中将回调函数作为参数传递。
array_maparray_filterusort

$numbers = [1, 2, 3, 4, 5];

// Double each number using a closure
$doubled = array_map(function ($n) {
    return $n * 2;
}, $numbers);

print_r($doubled); // Output: Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 )

在此示例中, 将闭包应用于数组的每个元素,将每个数字加倍并返回一个新数组。array_map$numbers$doubled

闭包功能强大,因为它们可以“记住”创建它们的环境中的变量。例如:

function createMultiplier($factor) {
    return function ($number) use ($factor) {
        return $number * $factor;
    };
}

$double = createMultiplier(2);
$triple = createMultiplier(3);

echo $double(5); // Output: 10
echo $triple(5); // Output: 15

在这种情况下,该函数返回一个闭包,该闭包将给定的数字乘以传递给 的 。闭包“关闭”变量,使其即使在完成执行后也可用。我们可以通过使用不同的因子调用来创建不同的乘数,并在以后重复使用它们。createMultiplier$factorcreateMultiplier$
factorcreateMultipliercreateMultiplier

闭包提供了灵活性,并支持 PHP 中更高级的编程技术。它们在函数式编程、事件处理和异步编程范例中特别有用。

在 PHP 中,可调用对象是一种类型,表示对可调用的函数或方法的引用。它可用于动态调用函数或方法,或将它们作为参数传递给其他函数。

PHP 中有几种类型的可调用对象:

  1. 函数:可调用对象可以通过将其名称用作字符串来引用常规 PHP 函数。
function greet($name) {
    echo "Hello, $name!";
}

$callable = 'greet';
$callable('John'); // Output: Hello, John!

在此示例中,变量保存函数“greet”的名称。可以通过在可调用变量后附加括号来调用它。$callable()

2. 方法:可调用对象也可以指对象的方法或类的静态方法。

class MyClass {
    public function greet($name) {
        echo "Hello, $name!";
    }
}

$obj = new MyClass();
$callable = [$obj, 'greet'];
$callable('John'); // Output: Hello, John!

在这种情况下,可调用对象是包含对象实例或类名和方法名的数组。

3. 匿名函数(闭包):如前所述,闭包也是可调用的。

$callable = function ($name) {
    echo "Hello, $name!";
};

$callable('John'); // Output: Hello, John!

在这里,闭包被赋值给变量,它可以像任何其他可调用对象一样被调用。$callable

4. 静态方法:可调用对象可以使用类名作为字符串来引用类的静态方法。

class MyClass {
    public static function greet($name) {
        echo "Hello, $name!";
    }
}

$callable = ['MyClass', 'greet'];
$callable('John'); // Output: Hello, John!

在这种情况下,可调用对象是包含类名和静态方法名的数组。

5. 可调用对象:实现该方法的对象可以被视为可调用对象。__invoke()

class Greeting {
    public function __invoke($name) {
        echo "Hello, $name!";
    }
}

$obj = new Greeting();
$callable = $obj;
$callable('John'); // Output: Hello, John!

在此示例中,类实现该方法,允许该类的对象可调用。Greeting__invoke()

在 PHP 中使用高阶函数、回调和动态调度时,通常使用可调用对象。它们提供了灵活性,并支持函数和方法的动态调用,从而允许更动态和可重用的代码。

有什么区别?

在PHP中,“callable”和“closure”都与函数或方法的概念有关,但它们具有不同的含义和用法:

  1. 可调用:“可调用”是一个类型提示或类型声明,它指定函数或方法的参数或返回值必须是有效的函数或方法引用。它是一个更广泛的术语,包含不同类型的可调用实体,包括常规函数、方法、闭包和实现方法的对象。__invoke()

例如,当您使用需要可调用对象的参数定义函数时,这意味着您可以将任何有效的可调用对象作为参数传递给该函数:

function process(callable $callback) {
    // Perform some processing
    $callback();
}

function myFunction() {
    echo "This is a regular function.";
}

$myClosure = function() {
    echo "This is a closure.";
};

process('myFunction');   // Valid: Passing a regular function
process($myClosure);     // Valid: Passing a closure

在此示例中,函数需要一个可调用的参数。它可以接受常规函数 () 和闭包 (),因为两者都是可调用的。process$callbackmyFunction$myClosure

2. 闭包:闭包是 PHP 中一种特定类型的可调用。它是一个匿名函数,可以分配给变量或作为值传递。闭包能够从其周围范围内“关闭”变量,即使在外部函数完成执行后也能捕获和保留对这些变量的访问。

闭包是使用关键字创建的,无需指定名称,并且它们可以选择使用该关键字从周围范围捕获变量。functionuse

$greeting = function ($name) {
    echo "Hello, $name!";
};

$greeting('John'); // Output: Hello, John!

在此示例中, 是一个闭包,它接受参数并回显问候语。可以使用变量作为函数调用闭包。$greeting$name

闭包提供了一种动态创建函数并更好地控制变量范围的方法。它们通常用作回调或用于实现高阶函数。

总而言之,“可调用”是一个类型提示或声明,将参数或返回值表示为函数或方法引用,而“闭包”特指可以从其周围范围捕获变量的匿名函数。闭包是可调用对象的子集,但提供其他功能,例如变量封装。

相关推荐