2012-07-21 4 views
5

Tôi cố gắng để hiểu về các lớp học đóng cửa, tại hướng dẫn có, Tất cả tại hướng dẫn Link,PHP, Lớp Đóng

Đóng :: __ xây dựng - Constructor không cho phép instantiation. Nếu tôi hiểu nó đúng trường hợp duy nhất của lớp này là để gán biến chức năng ẩn danh.

Nhưng tôi không hiểu vài dòng:

Đóng :: bind - bản sao đóng cửa với một đối tượng và lớp bị ràng buộc phạm vi cụ thể.

Đóng cửa :: bindTo - Nhân đôi quá trình đóng với đối tượng ràng buộc mới và phạm vi lớp học.

Và cuối cùng tại hướng dẫn tôi đã không hiểu câu này:

Bên cạnh những phương pháp liệt kê ở đây, lớp này cũng có một __invoke phương pháp. Điều này là để nhất quán với các lớp khác thực hiện phép thuật gọi là , vì phương pháp này không được sử dụng để gọi hàm.

Nếu một số người có thể cố gắng giải thích những lời thoại với tôi, tôi sẽ rất biết ơn, Chúc một ngày tốt lành.

+0

Cảm ơn tất cả các bạn đang đọc câu trả lời ngay bây giờ. –

Trả lời

7

Nó đang đề cập đến calling magic.

Theo hiểu biết của tôi, đối với bất kỳ lớp nào chứa phương thức __invoke, các thể hiện của nó có thể được gọi như thể nó là một hàm. Closure::__invoke hoạt động như thế.

tức là khi $foo là của lớp Closure (chức năng ẩn danh), gọi $foo($bar) sẽ gọi $foo->__invoke(bar) (mặc dù các thành viên __invoke không có nghĩa là để được gọi trực tiếp, điều này chỉ là để hiển thị như thế nào nó hoạt động).

Khi bạn xác định chức năng ẩn danh, bạn làm như sau:

$greet = function($name) 
{ 
    printf("Hello %s\r\n", $name); 
}; 

Bây giờ, $greet là của lớp Closure. và $greet->__invoke là loại bằng function($name){ printf("Hello %s\r\n", $name); }

Và hãy nhớ, Closure::__invokeMagic Method.

+0

Cảm ơn bạn Alvin Wong cho bạn giải thích về phương pháp ma thuật __invoke tôi cũng biết bây giờ trên một phù thủy phương pháp ma thuật tôi có thể sử dụng tại OOP để cảm ơn bạn và có một ngày tốt đẹp. –

3

Tôi nghĩ rằng sự khác biệt giữa bindbindTo chỉ là theo cách chúng được gọi là:

$cl->bindTo($obj) 

tương đương với

Closure::bind($cl, $obj) 

Về __invoke meethod, nó nói rằng phương pháp này tồn tại , nhưng nó không thực sự được sử dụng. Khi bạn sử dụng đóng như một hàm, một cơ chế bên trong (có lẽ hiệu quả hơn) được sử dụng để bỏ qua phương thức. Nhưng phương pháp này có khả năng tương thích với các lớp khác có thể gọi được và bạn có thể gọi nó theo cách thủ công nếu bạn muốn.

+0

Cảm ơn bạn Barmar bạn có thể vui lòng mở rộng thêm một chút về ràng buộc và bindTo bởi vì tôi không biết nếu tôi có quyền này nếu bạn có thể so sánh bindTo và ràng buộc với một mã xin vui lòng. –

+0

như [this] (http://www.php.net/manual/en/closure.bind.php) nói rằng 'Phương thức này là một phiên bản tĩnh của Closure :: bindTo().' –

+0

Nhìn vào các ví dụ trong tài liệu. Tôi không nghĩ tôi có thể làm tốt hơn thế. Chúng chỉ là hai cách khác nhau để viết cùng một thứ chính xác - bindTo là hướng đối tượng, trong khi bind là kiểu hàm truyền thống. – Barmar