天天看點

PHP中 closure and callable的差異

作者:提莫135356594
PHP中 closure and callable的差異

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: 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

閉包提供了一種動态建立函數并更好地控制變量範圍的方法。它們通常用作回調或用于實作高階函數。

總而言之,“可調用”是一個類型提示或聲明,将參數或傳回值表示為函數或方法引用,而“閉包”特指可以從其周圍範圍捕獲變量的匿名函數。閉包是可調用對象的子集,但提供其他功能,例如變量封裝。