module_invoke_all () 또는 module_invoke () 및 module_implements ()를 사용하는 것이 더 낫습니까?


10

사용하기 module_invoke_all('some_hook')는 쉽지만 성능이 더 좋습니까?

foreach (module_implements('some_hook') as $module) {
  $data = module_invoke($module, 'some_hook');
}

답변:


11

약간의 차이가 있습니다. 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;
    }
  }

두 경우 모두, 검색된 정보는 색인이 모듈의 짧은 이름 인 배열에 저장됩니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.