日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 钩子,php钩子原理是什么

發布時間:2023/12/19 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 钩子,php钩子原理是什么 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鉤子原理很簡單,有些人把事情弄的過于發雜,其實就是調用某個目錄下的比如/hook目錄下注冊在hook函數里面和讀取hook配置文件里面的類的方法的一個調用類的方法的功能。

目的就是最少改動代碼,改動舊功能,或者增加一些新功能,或者簡單說成調用函數都行。

但是讀取hook的配置文件,還是需要在系統的里面每次都需要讀取,其實就失去了hook的意義,建議只做鉤子本身的就好。

相關推薦:《PHP入門教程》

參看一下ci的hook,僅截取hook函數核心部分。<?php

protected function _run_hook($data) {

// Closures/lambda functions and array($object, 'method') callables

if (is_callable($data)) {

is_array($data) ? $data[0]->{$data[1]}() : $data();

return TRUE;

} elseif (!is_array($data)) {

return FALSE;

}

if ($this->_in_progress === TRUE) {

return;

}

if (!isset($data['filepath'], $data['filename'])) {

return FALSE;

}

$filepath = APPPATH . $data['filepath'] . '/' . $data['filename'];

if (!file_exists($filepath)) {

return FALSE;

}

$class = empty($data['class']) ? FALSE : $data['class'];

$function = empty($data['function']) ? FALSE : $data['function'];

$params = isset($data['params']) ? $data['params'] : '';

if (empty($function)) {

return FALSE;

}

// Set the _in_progress flag

$this->_in_progress = TRUE;

// Call the requested class and/or function

if ($class !== FALSE) {

// The object is stored?

if (isset($this->_objects[$class])) {

if (method_exists($this->_objects[$class], $function)) {

$this->_objects[$class]->$function($params);

} else {

return $this->_in_progress = FALSE;

}

} else {

class_exists($class, FALSE) OR require_once($filepath);

if (!class_exists($class, FALSE) OR ! method_exists($class, $function)) {

return $this->_in_progress = FALSE;

}

// Store the object and execute the method

$this->_objects[$class] = new $class();

$this->_objects[$class]->$function($params);

// 核心部分 讀取參數部分,去實例化類調用方法 傳遞參數 其實這也是MVC url路由實現的核心,現在很多

//都是使用 call_user_func_array call_user_func 這兩個方法

}

} else {

function_exists($function) OR require_once($filepath);

if (!function_exists($function)) {

return $this->_in_progress = FALSE;

}

$function($params);

}

$this->_in_progress = FALSE;

return TRUE;

}

原理圖解

個人實現版本

如果你覺得麻煩,甚至可以寫個方法都行,建議寫成一個類,因為有些東西需要更多的信息

phpinclude 'hook.class.php';

$rr = new hook();

//$ee = $rr->get_all_class();

$rr->run_hook('ff','ss',array());

//echo '

';

//print_r($ee);

//echo '

';

hook.class.phpclass hook {

public $HOOK_PATH;

public $PATH; //完整鉤子文件目錄

public $object;

//調用的時候這個類使用的時候,必須在系統的執行流程當中

public function __construct() {

$this->HOOK_PATH = ''; //項目的路徑,根據你的項目計算路徑

$current_path = str_replace("\\", "/", getcwd()); //獲取當前目錄

//這個地方在實際用的時候看你需要調整

$this->PATH = $current_path . $this->HOOK_PATH;

}

/* 注冊鉤子 也可以叫做運行鉤子

* $class 類名稱

* $function 方法

* $param 方法參數

*/

public function run_hook($class, $function, $param = array()) {

include $this->PATH . '/' . $class . '.class.php';

// var_dump($this->PATH . '/' . $class . '.class.php');

// call_user_func_array(array($class, $function), $param);//只能調用類的靜態方法

// call_user_func(array($class, $function), $param); //只能調用類的靜態方法

// 其他寫法

$this->object = new $class();

$this->object->$function($param); //這樣就可以不用調用靜態方法

}

//返回當前已經所有的鉤子類和方法 不要當前方法調用這個核心類,需要稍微改造,在$hook_array[$key]['function']的返回

方法名的時候

public function get_all_class() {

//搜尋hook目錄下的所有鉤子文件,返回數組

// $this->PATH

// var_dump($this->PATH);

$file_array = scandir($this->PATH);

$hook_array = array();

foreach ($file_array as $key => $value) {

if (strpos($value, '.class.php') == true) { //掃描路徑絕對不能和這個類本身在一個同一個目錄下,不然

會出現重復聲明的同名類

$name = explode('.', $value);

$hook_array[$key]['name'] = $name['0'] . '鉤子類';

$hook_array[$key]['url'] = $this->PATH . '/' . $value;

// include $hook_array[$key]['url'];

// $cc = new $name['0']();

// $hook_array[$key]['function'][] = get_class_methods($cc);

// $hook_array[$key]['function']['param'][] = get_class_vars($class_name); //獲取方法變量

}

}

return $hook_array;

}

}

調用的某個類名

ff.class.php 的ss方法public function ss() {

// static public function ss() {

echo 'dddddddddddddddddddd';

}

另一個版本

更方便調用class hooks {

const Directory_Structure = '/hooks/'; //相對目錄的路徑 具體項目使用的時候需要調整

static public function get_path() {

return str_replace("\\", "/", getcwd());

}

static public function run_hook($class, $function, $param = array()) {

$s = include self::get_path() . self::Directory_Structure .$class. '.class.php';

call_user_func(array($class, $function), $param); //只能調用類的靜態方法

// 其他寫法

// $object = new $class();

// $object->$function($param); //這樣就可以不用調用靜態方法

}

}

使用include 'hooks.class.php';

hooks::run_hook('ee', 'vv',$param =array());

當然也可以這么訪問

$foo = new hooks();

$foo->run_hook('ee', 'vv',array());

$foo::run_hook('ee', 'vv',array());

自 PHP 5.3.0 起,可以用一個變量來動態調用類。但該變量的值不能為關鍵字 self,parent 或 static。

鉤子是比較靈活的,可以額外增加一個功能代碼,使代碼更整潔,比如在做什么一些重要操作,創建訂單,在創建訂單之前需要做些什么,在創建之后做些什么,都可以使用鉤子,這樣代碼更加靈活。

總結

以上是生活随笔為你收集整理的php 钩子,php钩子原理是什么的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。