PHP中的鉤子(整合了網路上的相關資訊)

2021-07-16 10:51:54 字數 2256 閱讀 9269

#php的鉤子

##簡介

php的鉤子並沒有什麼特別,只是術語而已。

鉤子的完整實現應該叫事件驅動,一般分為兩種:

1. 註冊事件

>目的是給未來可能發生的'事件'起乙個名字,簡單的實現方法時用單例模式產生乙個持久不的物件或者註冊乙個全域性變數,然後將事件的名稱以及該事件對應的類與方法插入全域性變數即可。這就是掛在乙個鉤子

2. 觸發事件

>本質上就是在事件的全域性變數中查詢要觸發的事件名稱,然後找到註冊好的類與方法,例項化該類並執行該方法。這樣就可以擺脫傳統方式中程式必須按順序執行的規則,進一步實現解除耦合的目的。

**鉤子函式可以截獲並處理其他應用程式的訊息。**每當特定的訊息發出,在沒有到達目的視窗前,鉤子程式就先捕獲該訊息,亦即鉤子函式先得到控制權。這時鉤子函式即可以加工處理(改變)該訊息,也可以不作處理而繼續傳遞該訊息,還可以強制結束訊息的傳遞。

可以看到:

1、鉤子函式是預設(註冊事件)並在特定的條件下觸發的。

2、鉤子函式接管程式後(觸發事件)可以影響到程式的走向。

**簡單點說,**鉤子就是特定條件下執行一段程式;

再簡單點,鉤子就是實現解除if判斷的一種方式。

過多的if判斷會導致程式難以閱讀和維護,而通過鉤子的處理可以讓程式更靈活。鉤子有一定的觸發條件,條件可以是配置、從資料庫讀取,或者通過一些技術來實現,比如反射等,使用鉤子可以達到解耦的目的。

**php中的鉤子就類似前端js中的事件監視和觸發**

##實現和解析

鉤子是程式設計裡乙個常見概念,非常的重要。它使得系統變得非常容易拓展(不用更改內部的實現,只需要更改外部的鉤子即可),(而不用理解其內部的實現機理,這樣可以減少很多任務作量)。只要有乙個鉤子樣本,能很容易仿照第乙個鉤子快速的編寫第二個鉤子,這裡對鉤子進行乙個簡單的理解小結。

下面乙個最簡單的**例子:

<?php

class   test   

}test::example();

?>

乙個測試類test裡面,寫了乙個example方法。本來這個example的方法非常簡單的,就是輸出hello。但是在輸入的時候,我們還有其他的事情要做(這裡我假定了在輸入hello之前有乙個字串要輸出,在結尾有個陣列要輸出)。

我們現在有倆種寫法:

>第一:我們可以直接在方法裡面實現我們需要的功能

但是會有個問題,就是我們每次更動系統,都需要去更改系統的核心部分(我們假定test是系統的核心,更改是需要不斷地更改test類的**,即修改了核心;當核心**非常多的時候,開發的時候不適宜直接改動核心部分)。這樣會需要我們每次改動都要跳到類test內部去改動,這樣的開發成本會非常大,而且**全部在一起非常的不好維護。就像上面的那種實現方法

>第二:我們封裝乙個exec的方法

function  exec($parms) else

}這樣我們實現的時候,方便了很多,下面的方法簡化成了

class   test   

}但是現在仍然有個問題,我們改動的時候,仍然要去系統內部改動(

**因為"i am a hook test

"和array(1,2,3,4,5,6)都是在核心中傳入的**,我們最終需要的目標是不改動核心的情況下,可以直接改動,如果是簡單的陣列和字串,是可以進行配置的,但是如果是邏輯的時候,配置行不通)。

我們想的是寫乙個類(通過這個類,向系統傳送資訊的時候,系統可以直接呼叫我們的類,而且我們的類只要遵循一定的規則設計,直接和原系統是相容的)。做了改進設計出如下鉤子格式:

<?php

class   test   

}//鉤子類

class  hook   else

if($type=='string') elseif($type=='arr') }}

我們只要改動乙個外部的hello類(

**不要在鉤子裡直接寫上實現方法,鉤子只是乙個中轉的作用,用來監控事件。因此盡量使用外部類或方法來實現事件觸發的操作**),就可以實現對系統內部的控制了。

class   hello  

public  function arr()

}test::example();

?>

從上面可以看出,組成乙個單獨的類,系統內部的實現固定了後。外部可以寫各種類,進行鉤子的實現,現在寫了乙個hello類。假如增加乙個拓展world類

同樣可以僅僅改動hook,而不用去改動test系統內部,只要我們定義乙個抽象類

abstract  class  lan

然後讓所有的擴充套件類,比如hello或者另外寫個類world繼承這個抽象類,就可以直接寫個擴充套件。

談PHP中的鉤子

鉤子,英文為hooks。在程式中應用相當廣泛,但是究竟什麼是鉤子呢?本人介紹一下目前本人對鉤子的理解和相關心得。假如有這麼一段程式流 function fun fun函式正常的執行順序,肯定是執行完funa,然後執行funb,然後fun函式就結束了。但是,假如我們想對函式做一些變化。比如說,fun是...

談PHP中的鉤子

鉤子,英文為hooks。在程式中應用相當廣泛,但是究竟什麼是鉤子呢?本人介紹一下目前本人對鉤子的理解和相關心得。假如有這麼一段程式流 function fun fun函式正常的執行順序,肯定是執行完funa,然後執行funb,然後fun函式就結束了。但是,假如我們想對函式做一些變化。比如說,fun是...

談PHP中的鉤子

鉤子,英文為hooks。在程式中應用相當廣泛,但是究竟什麼是鉤子呢?本人介紹一下目前本人對鉤子的理解和相關心得。假如有這麼一段程式流 function fun fun函式正常的執行順序,肯定是執行完funa,然後執行funb,然後fun函式就結束了。但是,假如我們想對函式做一些變化。比如說,fun是...