<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
現在主流的cms或者blog等系統中,都內建的有外掛系統,但是層層深入、剖析實現的方式,其實都是最簡單的勾點的複雜化的實現。
勾點是外掛執行的觸發器;外掛就像掛在勾點上的東西;外掛只有實現相應勾點方法,並安裝啟用成功後才能執行。
開發者也可以用hook('test')方法在控制器只加入勾點,讓你的應用具有更好的擴充套件性;同時也可以模板里加入勾點{:hook('footer')};勾點也支援傳入引數hook('footer',array('test'=>1));
向系統暴露你的勾點,就是把你的勾點在相應的檔案裡列出來,系統會來檢測。
{:hooks('documentDetailAfter')}
這個的意思就是:相當於在這邊 打一個點 ,我們可以將外掛掛載到那
官方的說法是:檔案末尾顯示顯示的 勾點
意思就是說,在檔案末尾的時候,會自動呼叫掛載在那個 勾點 上的外掛
php中所謂的勾點,其實就是一種事件驅動,主要分為‘註冊事件’、‘觸發事件’兩步。所謂‘註冊事件’,即目的是給未來可能發生的'事情'起一個名字,名字,可以用單例模式或者註冊 為一個全域性的變數,用的時候直接在對應的方法或者類再或者函數中插入這個變數即可;‘觸發事件’,本質上就是在事件的全域性變數中查詢要觸發的時間名稱,然後找到註冊號的類與方法,範例化執行。
舉個例子來說明一下。
專案經理給我們瞭如下的需求:
第一天:開發註冊的功能。
程式設計師巴拉巴拉,三下五除二就完成了。
第二天:在註冊前新增傳送簡訊驗證碼的功能。
程式設計師巴拉巴拉,三峽五除二就又完成了。
第三天:註冊完成之後,給使用者新增相應的積分。
程式設計師又開始巴拉巴拉ing……
class Register{ public function index(){ /** * 第二天傳送簡訊功能 */ /** * 第一天註冊程式碼 */ /** * 第三天增加積分功能 */ } }
這樣一個人開發還好,多個人開發,勢必會造成配合麻煩的問題,同時程式碼也會變得混亂。
作為優秀程式設計師的我們,當然不容許我們程式中程式碼冗餘、混亂的出現,於是我們把方法寫成函數獨立出來,方便呼叫與程式碼簡介。於是形成如下程式碼:
class Register{ public function index(){ /** * 第二天傳送簡訊功能 */ sendMsg($data); /** * 第一天註冊程式碼 */ /** * 第三天增加積分功能 */ sendIntegral($data); } } /** * 傳送簡訊 * @param {[type]} $data [description] * @return {[type]} [description] */ function sendMsg($data){ /* balabala */ } /** * 贈送積分 * @param {[type]} $data [description] * @return {[type]} [description] */ function sendIntegral($data){ /* balabala */ }
但是我們想要把程式開元出去讓更多的人蔘與,這種直接修改原始碼碼的方式始終不是太好,這個時候,我們就可以使用勾點的方式,在註冊成功前後註冊兩個勾點,我們只需要把勾點告訴開發人員就行了,這樣他們不用改變原始碼碼就可以輕易的進行拓展。
class Register{ public function index(){ //註冊前勾點 Hook::run('registerBefore'); /** * 註冊程式碼 */ //註冊後勾點 Hook::run('registerAfter'); } }
目錄結構:../hook/Hook.php
<?php namespace hook; class Hook{ static protected $hook = []; /** * 外掛註冊 * @param [type] $name [description] * @param [type] $addons [description] */ static public function add($name,$addons){ self::$hook[$name] = $addons; } /** * 外掛執行 * @param [type] $name [description] * @return [type] [description] */ static public function run($name){ if(isset(self::$hook[$name])){ $method = (new self::$hook[$name]()); call_user_func([$method,$name]); } } }
<?php namespace addonsdemo; class Demo{ public function registerBefore(){ echo 'registerBefore'.'</br>'; } public function registerAfter(){ echo 'registerAfter'.'</br>'; } }
<?php namespace indexcontroller; use hookHook; class Index{ public function index(){ Hook::run('registerBefore'); echo '註冊完成'.'</br>'; Hook::run('registerAfter'); } }
<?php use indexcontrollerIndex; spl_autoload_register('autoload'); function autoload($name){ require_once('/'.str_replace('\','/',$name).'.php'); } //外掛註冊 hookHook::add('registerBefore','\addons\demo\Demo'); hookHook::add('registerAfter','\addons\demo\Demo'); //呼叫 $index = new Index(); $index->index();
- registerBefore
- 註冊完成
- registerAfter
如果要新增新的功能,程式設計師只要修改demo的外掛就可,如果要拓展新的功能,只需要拓展registerBefore和registerAfter即可。
可以說,勾點就是掛載點。
掛載點:在系統中提供給你一個掛載點,我們可以進行外掛開發,開發完成後,我們將其掛載到 掛載點上,會自動呼叫執行。
到此這篇關於thinkphp(php)外掛勾點(hooks)分析的簡單實現機制的文章就介紹到這了,更多相關php外掛勾點(hooks)內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45