Bạn có câu trả lời tại đây: https://stackoverflow.com/a/29730810/4629261
Sự khác biệt là, [ Closure
] phải là một hàm ẩn danh, trong đó [ callable
] cũng có thể là một hàm bình thường.
Bạn có thể xem / kiểm tra điều này với ví dụ bên dưới và bạn sẽ thấy rằng bạn sẽ gặp lỗi cho lần đầu tiên:
function callFunc1(Closure $closure) {
$closure();
}
function callFunc2(Callable $callback) {
$callback();
}
function xy() {
echo 'Hello, World!';
}
callFunc1("xy"); // Catchable fatal error: Argument 1 passed to callFunc1() must be an instance of Closure, string given
callFunc2("xy"); // Hello, World!
Vì vậy, nếu bạn chỉ muốn gõ hàm ẩn danh, hãy sử dụng: Closure
và nếu bạn cũng muốn cho phép các hàm bình thường sử dụng callable
làm gợi ý kiểu.
http://php.net/manual/en/ class.clenses.php
http://php.net/manual/en/lingu.types.callable.php
Trong tài liệu Magento, họ đề nghị sử dụng [có thể gọi được]
Trước danh sách các đối số của phương thức ban đầu, xung quanh các phương thức sẽ nhận được một cuộc gọi sẽ cho phép gọi đến phương thức tiếp theo trong chuỗi. Khi có thể gọi được, plugin tiếp theo hoặc chức năng quan sát được gọi.
Khi bạn bao bọc một phương thức chấp nhận các đối số, plugin của bạn cũng phải chấp nhận các đối số đó và bạn phải chuyển tiếp chúng khi bạn gọi tiến trình có thể gọi được.
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html#defining-a-plugin