2012-09-18 12 views
6

私は、Drupalが使用するフックシステムと非常によく似たフックシステムを構築する方法を見つけようとしています。 Drupalを使用すると、関数の名前を簡単に指定できます。モジュールが有効になっている場合、フックとして自動的に呼び出されます。どうすればこのように動作する単純なPHPフックシステムを構築できますか?

私はここStackoverflowで他の答えを見てきましたが、実際にこのタイプの機能をPHPアプリケーションに組み込む方法の答えはありません。

+0

Drupalを見てリバースエンジニアリングしますか? –

+0

@ Paul私は実際にそれをやっていますが、Drupalは実際に必要な機能よりかなり多くの機能を持っています。実際にHookシステムを実際に処理しているかどうかははっきりしていません。 –

答えて

2

私はDrupalの内部に精通していないんだけど、それはおそらく、それはリフレクションを使用しない:

http://php.net/manual/en/book.reflection.php

をあなたが関数やクラスを見つけるためにリフレクションを使用し、その後、フック関数が含まれているPHPのページが含まれます(モジュールのライフサイクル内のイベントなど)適切なときにこれらの関数を呼び出すための関数ポインタを保存します。

+0

なぜ私は投票したのですか? – Dai

+0

あなたが提供したページを読んでいますが、誰かが理由を説明せずに投票してしまう理由はわかりません。ありがとう。 –

3

PHPのget_defined_functionsを使用して、関数名の文字列の配列を取得し、それらの名前を事前定義された形式でフィルタリングすることができます。 PHPのドキュメントから

このサンプル:

<?php 
function myrow($id, $data) 
{ 
    return "<tr><th>$id</th><td>$data</td></tr>\n"; 
} 

$arr = get_defined_functions(); 

print_r($arr); 
?> 

出力する。このような何か:

Array 
(
    [internal] => Array 
     (
      [0] => zend_version 
      [1] => func_num_args 
      [2] => func_get_arg 
      [3] => func_get_args 
      [4] => strlen 
      [5] => strcmp 
      [6] => strncmp 
      ... 
      [750] => bcscale 
      [751] => bccomp 
     ) 

    [user] => Array 
     (
      [0] => myrow 
     ) 

) 

より明示的なフックシステムと比較すると、それはちょっと大ざっぱ技術だが、それは動作します。

+0

+1。そしてサイドノートもあります:https://github.com/AOP-PHP/AOPもあり、これを補完することができます。実際には、私はクリーンなデザインでは、あなたは "定義された機能"でこのハックなしで、アスペクト指向のプログラミングを使用すると思いますが、私はOPが高度ではないと思います。それにもかかわらず、それは他の読者にとってはうれしいことです。これを使用するには、少なくとも1つのVPSが必要です。これは、AOP拡張機能が標準の配布に含まれていないためです。 – Flavius

8

これはdrupalがそれを行う方法と、あなたがそれを行う方法です。 名前のコンベンションでの文字列連結の使用。 function_exists()およびcall_user_func_array()を使用すると、すべて設定する必要があります。

ここ

トリック(module.inc)

function module_invoke() { 
    $args = func_get_args(); 
    $module = $args[0]; 
    $hook = $args[1]; 
    unset($args[0], $args[1]); 
    $function = $module .'_'. $hook; 
    if (module_hook($module, $hook)) { 
    return call_user_func_array($function, $args); 
    } 
} 

function module_hook($module, $hook) { 
    return function_exists($module .'_'. $hook); 
} 

を作る二つの内部Drupalの機能はそのため、あなただけの最後に

ModuleName_HookName($arg1,$arg2,$arg3); 
を呼び出します

module_invoke('ModuleName','HookName', $arg1, $arg2, $arg3); 

を起動する必要があります

+0

あなたがなぜ改造されたのか分かりません、私もそうでした。 – Dai

0

なぜ機能を使用するだけではないのですか?デベロッパーは特定の方法で関数に名前を付けることができ、フックコードはそれが存在することを確認してから呼び出すことができます

関連する問題