답변:
약간의 차이가 있습니다. module_invoke_all()
다음 코드를 실행합니다.
function module_invoke_all() {
$args = func_get_args();
$hook = $args[0];
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()
예 func_get_args()
를 들어을 사용하면 한 번만 호출되고 using module_invoke()
func_get_args()
을 호출 할 때 마다 호출 될 때 마다 다릅니다 module_invoke()
. 그러나 그것은 조금 차이가 있습니다. 검색 기능을 구현하는 모듈에 대한 정보 배열을 빌드하는 경우와 같이 일반적으로 모듈이 호출 된 모듈을 알아야하는
경우 module_implementing()
및 module_invoke()
사용되는 경우가 몇 가지 search_get_info()
있습니다.
function search_get_info($all = FALSE) {
$search_hooks = &drupal_static(__FUNCTION__);
if (!isset($search_hooks)) {
foreach (module_implements('search_info') as $module) {
$search_hooks[$module] = call_user_func($module . '_search_info');
// Use module name as the default value.
$search_hooks[$module] += array(
'title' => $module,
'path' => $module,
);
// Include the module name itself in the array.
$search_hooks[$module]['module'] = $module;
}
}
if ($all) {
return $search_hooks;
}
$active = variable_get('search_active_modules', array('node', 'user'));
return array_intersect_key($search_hooks, array_flip($active));
}
또 다른 예는 image_styles ()입니다 .이 모듈은 모듈에서 구현 한 모든 이미지 스타일 목록을 가져오고 다음 코드를 사용합니다.
foreach (module_implements('image_default_styles') as $module) {
$module_styles = module_invoke($module, 'image_default_styles');
foreach ($module_styles as $style_name => $style) {
$style['name'] = $style_name;
$style['module'] = $module;
$style['storage'] = IMAGE_STORAGE_DEFAULT;
foreach ($style['effects'] as $key => $effect) {
$definition = image_effect_definition_load($effect['name']);
$effect = array_merge($definition, $effect);
$style['effects'][$key] = $effect;
}
$styles[$style_name] = $style;
}
}
두 경우 모두, 검색된 정보는 색인이 모듈의 짧은 이름 인 배열에 저장됩니다.
코드를 살펴보면 module_invoke_all 이 그 외에도 몇 가지 온 전성 검사를 수행합니다. 그리고 쉽습니다. :-)
둘 다 사용하지 않는 것이 좋으며 대신 drupal_alter () 를 사용 하십시오 .
에 명시된 바와 같이 module_invoke_all () 문서 ,
모든 인수는 값으로 전달됩니다. 참조로 인수를 전달해야하는 경우 drupal_alter ()를 사용하십시오.