2013-12-15 114 views
0

我已經試着Google如何做到這一點,但我仍然無法弄清楚。如何在PHP中創建一個簡單的鉤子?以下是我試過到目前爲止:PHP如何創建簡單的鉤子?

wrapper.php(應用程序從這裏開始)

<?php require 'core.php'; ?> 
<?php require 'view.php'; ?> 

core.php中

<?php 

$hooks['hook_head'] = array(); 

//supposed to insert action in $hooks 
function addHook($hookName, $funct){ 
    global $hooks; 
    array_push($hooks[$hookName], $funct); 
} 


//supposed to execute specific hook 
function executeHook($hookname){ 
    global $hooks; 
    foreach($hooks[$hookname] as $funct){ 
     call_user_func($funct); 
    } 
} 

//supposed to execute action in $hooks when array key = hook_head 
function hook_head(){ 
    global $hooks; 
    if (array_key_exists('hook_head', $hooks)) { 
     executeHook('hook_head'); 
    } 
} 

//supposed to execute action in $hooks when array key == hook_footer 
function hook_footer(){ 
    global $hooks; 
    if (array_key_exists('hook_footer', $hooks)) { 
     executeHook('hook_footer'); 
    } 
} 

?> 

view.php

<!DOCTYPE HTML> 
<html> 
<head> 
    <?php hook_head(); ?> 
</head> 
<body> 
    <hr /> 

    <?php 
     //add action to hook start here 
     $test = function(){ echo "test succeds"; }; 
     addHook('hook_head', $test); 
    ?> 

    <?php hook_footer(); ?> 
</body> 
</html> 

如果我在$hooks['hook_head']之內插入一個動作,則在我致電hook_head()之前,該代碼正常工作。我實際上想要做的是在我打電話給hook_head()之後插入操作。我該怎麼做呢?

+1

的直觀的控制流不知道你知道一個鉤子是什麼。 – FaddishWorm

+0

你確實想爲每個'鉤子名'有多個功能? – robbmj

+0

@FaddishWorm好吧,我開始懷疑我對鉤子的瞭解。我只想從身體標記中迴應標籤頭中的內容。 – ilike

回答

2

addHook調用移到hook_head調用之前(最好是文件的開頭)。

我沒有注意到你「想在hook_head()之後開始編碼(在鉤頭中插入動作)」,但這非常麻煩。它看起來像這樣:

  • 更改hook_head()將某種類型的標記插入到輸出中。
  • 在腳本結尾處,
    1. 調用ob_get_clean()獲取頁面的輸出緩衝區。
    2. 對於每個掛鉤:
      1. 執行掛鉤。
      2. 再次調用ob_get_clean()以獲取鉤子的輸出緩衝區。
      3. 用鉤子的輸出緩衝區替換頁面的oputput緩衝區中的相應標記。
    3. 打印頁面的輸出緩衝區。

正如我所說:繁瑣。我強烈反對它。我只是提到它,因爲你特別提問。它違背

  1. 輸入
  2. 處理
  3. 輸出
+0

我也想過它,它不可能,我可以做些什麼可能會改變core.php中的一切或做任何事情使它成爲可能? – ilike

+0

呃,這實際上是可能的,但我真的不想談論它。 – Oswald

+0

謝謝你的智慧先生 – ilike