Первый вопрос: Да.
Второй вопрос: Помимо использования этих функций, вы также можете вызвать module_implements () напрямую и вызвать их вручную. Пример использования - это когда вы хотите передать аргументы по ссылке, но не хотите использовать схему именования hook_something_alter (), в которую вас заставляет drupal_alter ().
module_implements () возвращает массив модулей, которые реализовали данный хук. В Drupal 6 это просто цикл по всем модулям, а затем проверка функции $ module. '_'. $ hook существует.
В Drupal 7, например, можно определить, что ваш hook_yourmodule_something может находиться в anothermodule.yourmodule.inc, и Drupal будет автоматически искать этот файл и включать его при необходимости. См. hook_hook_info . Кроме того, также можно изменить список модулей, которые реализуют ловушку, что является довольно сумасшедшим и должно использоваться с осторожностью. См. hook_module_implements_alter .
Поскольку эти функции делают обнаружение немного медленнее, чем в D6, к этому был добавлен кэш. Это в основном означает, что всякий раз, когда вы добавляете реализацию ловушки в D7, вам необходимо очистить кеш.
Пример ручной реализации:
<?php
// Custom hooks should always be prefixed with your module name to avoid naming conflicts.
$hook_name = 'yourmodule_something';
// Get a list of all modules implementing the hook.
foreach (module_implements($hook_name) as $module) {
// Build the actual function name.
$function = $module . '_' . $hook_name;
// Call the function. Anything passed in to the function can be by-reference if the
// hook_implementation defines it so. If you don't want that, you might want to give them
// only a copy of the data to prevent abuse.
$function($arg1, $arg2, $arg3, $arg4);
}
?>
Если вы посмотрите на код функций, которые вы связали в своем вопросе, вы увидите, что они в основном просто вспомогательные функции для той же процедуры, так что это также должно помочь улучшить общее понимание вызова ловушек.