Một cách để phân chia chúng là về đầu vào và đầu ra: 1) chỉ đầu vào, 2) chỉ đầu ra, 3) đầu vào-đầu ra và 4) không đầu vào, không đầu ra.
Không có nhiều số 1, vì gần như bất cứ điều gì xảy ra đều có thể có một số phản ứng. Các ví dụ duy nhất tôi có thể nghĩ đến là xóa hook, ví dụ hook_file_delete (), hook_comment_delete (), trong đó hook lấy đối tượng bị xóa, nhưng đối tượng đó đã bị xóa, vì vậy không có lý do gì để phản hồi.
Các hook "kiểu đăng ký" sẽ là # 2, chỉ xuất ra. Họ chỉ cung cấp dữ liệu vào một sổ đăng ký trung tâm và không nhận bất kỳ đầu vào nào. hook_menu () và hook_help () là những ví dụ.
hook_nodeapi () là # 3, nhưng bây giờ nó được chia thành các hàm khác nhau như hook_node_presave () - vẫn là # 3 - và hook_node_delete () - hiện là # 1. Đây là nhóm phổ biến nhất. Nhiều ví dụ rõ ràng có từ "thay đổi" trong tên hook, ví dụ hook_form_alter ().
Một cái gì đó như hook_init () sẽ là # 4. Ngoài thông báo chung về một sự kiện, không có đầu vào cũng như đầu ra.
Đó là một sự cố khá tùy tiện. Bạn có thể dễ dàng tranh luận về việc chia số 3 thành các hook trong đó đầu ra có cấu trúc giống như đầu vào (thay đổi) so với các hook trong đó đầu ra có cấu trúc hoàn toàn khác (phản hồi cuộc gọi). Hoặc bạn có thể kết hợp # 1 và # 4, vì chính hàm gọi là một kiểu đầu vào, vì vậy sự khác biệt chỉ là ở mức độ chi tiết.