Đóng trong php là gì

Các hàm ẩn danh (còn gọi là lambda) trả về đối tượng của lớp Đóng. Lớp này có một số phương thức bổ sung cung cấp thêm quyền kiểm soát đối với các hàm ẩn danh

cú pháp

Closure {
   /* Methods */
   private __construct ( void )
   public static bind ( Closure $closure , object $newthis [, mixed $newscope = "static" ] ) : Closure
   public bindTo ( object $newthis [, mixed $newscope = "static" ] ) : Closure
   public call ( object $newthis [, mixed $.. ] ) : mixed
   public static fromCallable ( callable $callable ) : Closure
}

phương pháp

đóng cửa riêng. __construct ( void ) — Phương thức này tồn tại chỉ để không cho phép khởi tạo lớp Closure. Các đối tượng của lớp này được tạo bởi hàm ẩn danh

đóng tĩnh công cộng. bind ( Closure $closure , object $newthis [,mixed $newscope = "static" ] ) − Closure — Sao chép một bao đóng với một đối tượng ràng buộc cụ thể và phạm vi lớp. Phương thức này là một phiên bản tĩnh của Closure. ràng buộc()

đóng cửa công khai. bindTo ( object $newthis [,mixed $newscope = "static" ] ) − Closure — Sao chép bao đóng với một đối tượng ràng buộc mới và phạm vi lớp. Tạo và trả về một hàm ẩn danh mới có cùng nội dung và các biến bị ràng buộc, nhưng với một đối tượng khác và phạm vi lớp mới

đóng cửa công khai. gọi ( đối tượng $newthis [, hỗn hợp $. ] ) − hỗn hợp — Tạm thời liên kết bao đóng với newthis và gọi nó với bất kỳ tham số đã cho nào

PHP bắt đầu hỗ trợ đóng từ thế hệ thứ 5. 3. 0 nhưng vẫn còn nhiều lập trình viên PHP chưa biết/chưa sử dụng hiệu quả. Tôi cũng chưa thấy nhiều bài viết về nó. Trong hướng dẫn đóng PHP ngày hôm nay, tôi sẽ cố gắng trình bày cách bạn có thể bắt đầu sử dụng nó một cách dễ dàng và làm cho ứng dụng web của bạn mạnh mẽ/tối ưu hóa hơn. Trước khi đi vào các ví dụ thực tế, giả sử rằng bạn còn khá mới với thuật ngữ này, trước tiên hãy tìm hiểu một vài định nghĩa liên quan

Chức năng ẩn danh. Chức năng ẩn danh là những gì tiêu đề của nó ngụ ý, một chức năng không có tên. Nếu bạn đã từng làm việc với JavaScript, bạn hẳn đã quen thuộc với các chức năng như vậy. Chúng khá hữu ích để viết các hàm nội tuyến ngắn, xác định gọi lại, v.v. Một ví dụ mã về hàm ẩn danh PHP

$functionReference = function(){ echo "anonymous function called"; }; $functionReference(); //prints: "anonymous function called"

Code language: PHP (php)


Bạn có thể đọc thêm chi tiết về chức năng ẩn danh php trên tài liệu chính thức

tải chậm. Lazy loading là một mẫu thiết kế phổ biến biểu thị việc trì hoãn tải một đối tượng cho đến khi nó được yêu cầu. Tại sao tôi sử dụng thuật ngữ này trong bài viết này? . Bạn sẽ nhận được một hình ảnh rõ ràng hơn;

Đóng cửa là gì

Chà, bao đóng chẳng là gì ngoài một biểu diễn đối tượng của một hàm ẩn danh. Đây là cách hướng đối tượng để sử dụng chức năng ẩn danh. Thú vị hơn, ví dụ về hàm ẩn danh ở trên mà chúng ta vừa xem trả về một tham chiếu đến đối tượng Closure, không chỉ một tham chiếu hàm. Do đó, phương thức đóng PHP 'bindTo' có thể được áp dụng cho tài liệu tham khảo này. Phương thức 'liên kết' khác là một cách tĩnh và một cách thay thế để có được hành vi tương tự

Những thứ khá đơn giản. Đúng?

Chúng ta có thể làm gì với việc đóng cửa?

Ở đây, tôi sẽ mô tả hai tính năng đơn giản nhưng mạnh mẽ mà việc đóng PHP cung cấp cho chúng ta sử dụng

  1. truy cập dữ liệu riêng tư của một thể hiện đối tượng và
  2. lười tải

Truy cập biến Riêng tư bằng cách sử dụng bao đóng

Một ví dụ đơn giản dưới đây sẽ cho bạn thấy một trong những siêu năng lực của việc đóng, truy cập vào biến riêng của một đối tượng

class SimpleClass { private $privateData = 2; } $simpleClosure = function() { return $this->privateData; }; $resultClosure = Closure::bind($simpleClosure, new SimpleClass(), 'SimpleClass'); echo $resultClosure();

Code language: PHP (php)


Nhìn thấy? . Theo cách tương tự, chúng ta có thể thêm/chèn hành vi mới vào một lớp PHP mà không cần sửa đổi nó.

Lazy Loading với PHP Closure

Như chúng ta đã thấy trong định nghĩa, lazy loading sẽ giúp ngăn chặn mọi khởi tạo cho đến khi nó được sử dụng. Hãy xem một ví dụ về cách chúng ta có thể đạt được điều này. Chúng tôi sẽ xác định trình ghi nhật ký gỡ lỗi Monolog, sẽ chỉ được sử dụng trong một số trường hợp nhất định

use Monolog\Logger; use Monolog\Handler\StreamHandler; $logClosure = function() { $log = new Logger('event'); $log->pushHandler(new StreamHandler("logfile.log", Logger::DEBUG)); return $log; }; //logger will not be initialized until this point $logger = $logClosure();

Code language: PHP (php)

Vì vậy, như bạn có thể thấy ở đây, chúng ta có thể viết tất cả các định nghĩa mà không cần khởi tạo thực tế bằng cách sử dụng bao đóng. Sau này, khi cần, hãy sử dụng nó với một phép gán đơn giản là ‘$logger = $logClosure()’

Sử dụng Biến ngoài bên trong đóng cửa

Vì phần thân đóng chỉ được thực thi theo yêu cầu, nên việc truyền một số giá trị/biến bên ngoài hơi khác một chút. Bạn sẽ phải sử dụng một từ khóa 'đang sử dụng' mới cho định nghĩa hàm đóng PHP này. Hãy xem một ví dụ khác

$someValue = "sample external data"; $simpleClosure = function() use($someValue) { return "Test accessing external value inside closure ".$someValue; }; echo $simpleClosure();

Code language: PHP (php)

Cái gì tiếp theo?

Triển khai Đóng cửa PHP thường được sử dụng trong các ứng dụng/khung công tác hiện đại. Vì vậy, tại sao không bạn? . mã hóa hạnh phúc

Làm cách nào để sử dụng bao đóng trong PHP?

Về cơ bản, bao đóng trong PHP là một hàm có thể được tạo mà không cần tên cụ thể - một hàm ẩn danh. Đây là hàm đóng được tạo làm tham số thứ hai của array_walk(). Bằng cách chỉ định tham số $v làm tham chiếu, người ta có thể sửa đổi từng giá trị trong mảng ban đầu thông qua hàm đóng .

một đóng cửa giải thích là gì?

Bao đóng là sự kết hợp của một hàm được nhóm lại với nhau (kèm theo) với các tham chiếu đến trạng thái xung quanh của nó (môi trường từ vựng) . Nói cách khác, một bao đóng cho phép bạn truy cập vào phạm vi của hàm bên ngoài từ một hàm bên trong.

đóng cửa và các loại là gì?

Hàm toàn cục và hàm lồng nhau, như đã giới thiệu trong Hàm, thực ra là những trường hợp đóng đặc biệt. Đóng cửa có một trong ba hình thức. Các hàm toàn cầu là các bao đóng có tên và không nắm bắt bất kỳ giá trị nào. Các hàm lồng nhau là các bao đóng có tên và có thể lấy các giá trị từ hàm kèm theo của chúng

một lớp đóng cửa là gì?

Lớp Closure ¶ . Các hàm ẩn danh mang lại các đối tượng thuộc loại này. Lớp này có các phương thức cho phép kiểm soát thêm chức năng ẩn danh sau khi nó được tạo. Ngoài các phương thức được liệt kê ở đây, lớp này còn có một phương thức __invoke. Class used to represent anonymous functions. Anonymous functions yield objects of this type. This class has methods that allow further control of the anonymous function after it has been created. Besides the methods listed here, this class also has an __invoke method.