最初の質問:はい。
2番目の質問:これらの関数を使用する以外に、module_implements()を直接呼び出して、手動で呼び出すこともできます。ユースケースの例は、参照によって引数を渡したいが、drupal_alter()が強制するhook_something_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);
}
?>
質問でリンクした関数のコードを見ると、基本的に同じ手順のヘルパー関数であることがわかります。したがって、これはフック呼び出しの一般的な理解を向上させるのにも役立つはずです。