Hello,大家好呀,我是杨杨!
本日水一篇,剖析下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: 10echo $triple(5); // Output: 15
在这种情形下,该函数返回一个闭包,该闭包将给定的数字乘以通报给 的 。闭包“关闭”变量,使其纵然在完成实行后也可用。我们可以通过利用不同的因子调用来创建不同的乘数,并在往后重复利用它们。createMultiplier$factorcreateMultiplier$factorcreateMultipliercreateMultiplier
闭包供应了灵巧性,并支持 PHP 中更高等的编程技能。它们在函数式编程、事宜处理和异步编程范例中特殊有用。
在 PHP 中,可调用工具是一种类型,表示对可调用的函数或方法的引用。它可用于动态调用函数或方法,或将它们作为参数通报给其他函数。
PHP 中有几种类型的可调用工具:
函数:可调用工具可以通过将其名称用作字符串来引用常规 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”都与函数或方法的观点有关,但它们具有不同的含义和用法:
可调用:“可调用”是一个类型提示或类型声明,它指定函数或方法的参数或返回值必须是有效的函数或方法引用。它是一个更广泛的术语,包含不同类型的可调用实体,包括常规函数、方法、闭包和实现方法的工具。__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 functionprocess($myClosure); // Valid: Passing a closure
在此示例中,函数须要一个可调用的参数。它可以接管常规函数 () 和闭包 (),由于两者都是可调用的。process$callbackmyFunction$myClosure
2. 闭包:闭包是 PHP 中一种特定类型的可调用。它是一个匿名函数,可以分配给变量或作为值通报。闭包能够从其周围范围内“关闭”变量,纵然在外部函数完成实行后也能捕获和保留对这些变量的访问。
闭包是利用关键字创建的,无需指定名称,并且它们可以选择利用该关键字从周围范围捕获变量。functionuse
$greeting = function ($name) { echo "Hello, $name!";};$greeting('John'); // Output: Hello, John!
在此示例中, 是一个闭包,它接管参数并回显问候语。可以利用变量作为函数调用闭包。$greeting$name
闭包供应了一种动态创建函数并更好地掌握变量范围的方法。它们常日用作回调或用于实现高阶函数。
总而言之,“可调用”是一个类型提示或声明,将参数或返回值表示为函数或方法引用,而“闭包”特指可以从其周围范围捕获变量的匿名函数。闭包是可调用工具的子集,但供应其他功能,例如变量封装。