Hàm ẩn danh đệ quy PHP

Bây giờ các chức năng ẩn danh đã có sẵn kể từ PHP 5. 3, Tôi thấy mình thường xuyên sử dụng chúng. Tuy nhiên, có một điều mà tôi dường như không thể hiểu đúng là có thể tự tạo một tham chiếu hàm ẩn danh - khi làm như vậy, nó sẽ gọi chính nó theo cách đệ quy

Làm thế nào để bạn làm điều này?

$func = function ($level = 0) {
    echo str_repeat(' ', $level) . "I am on level {$level}\n";
};
$func();
$func(1);
$func(2);
$func(3);

Điều này trở nên tẻ nhạt khi gọi đi gọi lại (có thể đặt nó trong một vòng lặp for để thực hiện cùng một việc - nhưng đây chỉ là một ví dụ đơn giản). Vì vậy, làm thế nào để chúng tôi thực hiện điều này như một chức năng ẩn danh tự gọi nó một cách đệ quy?

  1. Đảm bảo rằng đệ quy của hàm ẩn danh bị hạn chế theo một cách nào đó. Điều này ngăn không cho chính nó được gọi theo cách đệ quy vô hạn (và do đó khiến máy chủ của bạn phải quỳ gối)
  2. Bắt đầu sử dụng từ khóa use

Giải pháp

Để hàm ẩn danh có thể gọi chính nó một cách đệ quy, chúng ta cần đảm bảo rằng nó có một tham chiếu đến chính nó để nó có thể gọi. Vì vậy, giải pháp của chúng tôi, sử dụng một bao đóng

$maximum = 5; // This can be adjusted to as many levels as necessary.
$func = function($level = 0) use ($maximum, &$func) {
    echo str_repeat(' ', $level) . "I am on level {$level}\n";
    if ($level < $maximum) {
        $func($level + 1);
    }
};
$func();

Một lưu ý cuối cùng

Lưu ý cách hàm tự tham chiếu - sử dụng tham chiếu biến. Tại sao điều này là cần thiết?

Vì biến $func đang được sử dụng trong khai báo hàm ẩn danh nên nó chưa được điền vào thời điểm khai báo. Chuyển nó dưới dạng tham chiếu, chúng tôi có thể đảm bảo rằng vào thời điểm hàm được thực thi, biến $func sẽ được điền bằng hàm ẩn danh của chúng tôi

Trong quá trình phát triển Florrie, tôi gặp phải một tình huống yêu cầu đệ quy. Tuy nhiên, tôi đang làm việc trong một lớp học và không muốn lãng phí lớp học của mình với các chức năng không thể sử dụng lại, có mục đích duy nhất. tôi phải đối mặt với một vấn đề;

Đầu tiên, tôi sẽ làm rõ một chút về sự khác biệt giữa hàm tĩnh và hàm ẩn danh trong PHP. Nếu bạn biết tất cả những thứ này, hãy bỏ qua phần tiếp theo

Các hàm tĩnh là tiêu chuẩn trong các tập lệnh PHP. Nếu bạn định nghĩa một hàm như thế này, thì nó là tĩnh

function myFunction($arg) {
    echo $arg;
}
    
myFunction('Hiya'); // prints "Hiya"

Hàm

$maximum = 5; // This can be adjusted to as many levels as necessary.
$func = function($level = 0) use ($maximum, &$func) {
    echo str_repeat(' ', $level) . "I am on level {$level}\n";
    if ($level < $maximum) {
        $func($level + 1);
    }
};
$func();
0 đã được xác định tĩnh và nếu bạn cố xác định lại chúng, bạn sẽ nhận được lỗi nghiêm trọng sau.
$maximum = 5; // This can be adjusted to as many levels as necessary.
$func = function($level = 0) use ($maximum, &$func) {
    echo str_repeat(' ', $level) . "I am on level {$level}\n";
    if ($level < $maximum) {
        $func($level + 1);
    }
};
$func();
1

Hàm ẩn danh, còn được gọi là hàm đóng, được khai báo nội tuyến và được sử dụng bởi một đoạn mã khác. Chúng được định nghĩa theo cách này

$myFunction = function($arg) {
    echo $arg;
}

$myFunction('Heyo');    // Prints "Heyo"

Các loại chức năng này thường được sử dụng làm chức năng gọi lại, vì vậy bạn không có chức năng tĩnh bổ sung nằm xung quanh chỉ thực hiện một việc. Các hàm ẩn danh không nhất thiết phải được gán cho một biến; . Đây là một ví dụ nhanh sử dụng

$maximum = 5; // This can be adjusted to as many levels as necessary.
$func = function($level = 0) use ($maximum, &$func) {
    echo str_repeat(' ', $level) . "I am on level {$level}\n";
    if ($level < $maximum) {
        $func($level + 1);
    }
};
$func();
2

$values = array('foo', 'bar', 'baz');

array_map(function($value){ echo $value, ' '; }, $values);
// Will print "foo bar baz "

Vì vậy, trở lại câu hỏi ban đầu. bạn có thể sử dụng hàm ẩn danh theo cách đệ quy không?

Hóa ra là có, một chức năng ẩn danh có thể tự gọi chính nó. Có một vài phương pháp để làm điều đó, nhưng chỉ có một phương pháp rất có ý nghĩa

Để sử dụng một hàm ẩn danh một cách đệ quy, chúng ta cần cung cấp cho nó một cách để gọi chính nó. Thật không may, không có cách tích hợp nào để thực hiện việc này; . Điều đó dường như không phải là trường hợp, mặc dù. Có lẽ trong một phiên bản trong tương lai?

Hiện tại, cách duy nhất để cho phép một hàm ẩn danh gọi chính nó là gán nó cho một biến và cung cấp cho hàm ẩn danh một tham chiếu đến chính nó bằng cách sử dụng từ khóa use

Vì điều này phải được thực hiện trong khi chức năng ẩn danh đang được xác định, nên nó phải được gửi bằng tham chiếu;

Ví dụ nhanh, đây là ví dụ giai thừa đệ quy được thực hiện trong PHP

$factorial = function($value) use (&$factorial) {

    if($value <= 1) {
        return 1;
    }

    return $value * $factorial($value - 1);
};

echo $factorial(4);    // Prints "24"

Tôi đang sử dụng công cụ này để phân tích và xử lý các tệp XML theo cách đệ quy, nhưng bạn có thể sử dụng nó cho bất kỳ nơi nào mà bạn cần một chút đệ quy mà không cần thêm các chức năng bổ sung

Hàm ẩn danh có thể được đệ quy không?

Ngay cả khi không có cơ chế tham chiếu đến hàm hiện tại hoặc hàm gọi, có thể sử dụng đệ quy ẩn danh trong ngôn ngữ cho phép các hàm làm đối số . Điều này được thực hiện bằng cách thêm một tham số khác vào hàm đệ quy cơ bản và sử dụng tham số này làm hàm gọi đệ quy.

PHP có chức năng ẩn danh không?

Hàm ẩn danh, còn được gọi là bao đóng, cho phép tạo các hàm không có tên cụ thể. Chúng hữu ích nhất với vai trò là giá trị của các tham số có thể gọi được, nhưng chúng cũng có nhiều cách sử dụng khác. Các hàm ẩn danh được triển khai bằng cách sử dụng lớp Đóng . printf("Xin chao %s\r\n", $name);

Hàm đệ quy PHP là gì?

Đệ quy trong PHP - sử dụng khi nào và như thế nào. Xuất bản ngày 13 tháng 11 năm 2021. Đệ quy là một giải pháp lập trình trong đó hàm gọi chính nó . Nó được sử dụng để giải quyết nhiều vấn đề khác nhau, tất cả đều có điểm chung là cấu trúc chứa sự lặp lại.

Cú pháp của hàm ẩn danh trong PHP là gì?

Cú pháp. $var=function ($arg1, $arg2) { return $val; . Có dấu chấm phẩy sau định nghĩa hàm vì định nghĩa hàm ẩn danh là biểu thức. There is no function name between the function keyword and the opening parenthesis. There is a semicolon after the function definition because anonymous function definitions are expressions.