2010-07-28 52 views

回答

3

你可以這樣做ircmaxell建議:添加鉤子。但很明顯,他提供的信息對你來說還不夠。

如果您喜歡通過示例進行學習,您可以查看CMS Drupal,這不是面向對象,而是使用觀察者模式,在整個地方調用hooks以允許模塊化設計。

鉤的工作原理如下:

  • 一塊PHP的尋找一個特別命名的函數的存在。
  • 如果存在,把它和使用它的輸出(或者什麼都不做吧)

例如:

  • 就在一篇文章被保存在Drupal,文章系統調用hook_insert
  • 每個模塊的名稱爲ModuleName_insert的函數都會看到正在調用的函數。例如:pirate.module可能有一個函數pirate_insert()。文章系統沿所有模塊往返,看看ModuleName_insert是否存在。它將通過盜版模塊並發現pirate_insert()。然後它會調用該函數(並且也傳遞一些參數)。因此,允許pirate.module在插入之前更改文章(或者發起一些操作,例如將正文文本轉換爲盜版小說)。

魔法發生在所謂的user_callbacks中。 An example

$hook = 'insert' 
foreach (module_implements($hook) as $module) { 
    $function = $module .'_'. $hook; 
    $result = call_user_func_array($function, $args); 
} 

而且功能module_implements可能看起來像:

$list = module_list(FALSE, TRUE, $sort); //looks for files that are considered "modules" or "addons". 
foreach ($list as $module) { 
    if (function_exists($module.'_'.$hook)) { //see if the module has the hook 'registered' 
    $implementations[$hook][] = $module; //if so: add it to a list with functions to be called. 
    } 
} 
1

只需添加一個「*」掛鉤,並修改hook()函數來調用兩個命名事件和「*」所有事件「掛鉤」。

然後,只需做:

add_listener('*', 'mycallback'); 
+0

嗨夥計,我不明白這一點? – 2010-07-28 18:48:48

+0

基本上,創建一個由'*'標識的新鉤子。然後,編輯'hook()'函數來調用所有這些監聽器以及指定名稱的監聽器...... – ircmaxell 2010-07-28 18:50:12

0

看看Spl_Observer

你說你不想要OOP,但是你可以很容易地實現一個非OOP包裝。