/**
* Invokes a hook in all enabled modules that implement it.
*
* All arguments are passed by value. Use drupal_alter() if you need to pass
* arguments by reference.
*
* @param $hook
* The name of the hook to invoke.
* @param ...
* Arguments to pass to the hook.
*
* @return
* An array of return values of the hook implementations. If modules return
* arrays from their implementations, those are merged into one array.
*
* @see drupal_alter()
*/
function module_invoke_all($hook) {
$args = func_get_args();
// Remove $hook from the arguments.
unset($args[0]);
$return = array();
foreach (module_implements($hook) as $module) {
$function = $module . '_' . $hook;
if (function_exists($function)) {
$result = call_user_func_array($function, $args);
if (isset($result) && is_array($result)) {
$return = array_merge_recursive($return, $result);
}
elseif (isset($result)) {
$return[] = $result;
}
}
} return $return;
}
函数module_invoke_all()调用指定的钩子函数。例如stream_wappers钩子,假设有模块a和b都有实现该钩子,则会执行函数a_stream_wrappers()和b_stream_wrappers()。
函数module_invoke_all()所有参数都是传值的,如果需要传址参数,则需要使用函数drupal_alter()代替。
函数module_invoke_all()返回一个数组,上例的stream_wrappers钩子假设模块a和b都有返回值,则返回的结果应该是{a_stream_wrappers()结果,b_stream_wrappers()结果}。函数drupal_alter()没有返回值。