#### 它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无论是激活还是禁用都不影响系统核心模块的运行,也就是说插件是一种非侵入式的模块化设计,实现了核心程序与插件程序的松散耦合。 一个插件需要三个条件: 1、插件的支持函数,进行插件的功能实现 2、插件的Hook点,我们称为钩子埋入点,就是在什么地方这个插件要执行。 3、插件的位置 ~~~ <?php /* * 在插件列表中要添加的插件名 * @ pragma string $hook 插件列表名 * @ pragma string $actionFunc 插件名 */ function addAction($hook, $actionFunc){ global $emHooks; if (!@in_array($actionFunc, $emHooks[$hook])){ $emHooks[$hook][] = $actionFunc; } return true; } /** * 插件钩子的执行函数。也就是所谓的钩子的埋入点函数 * @param string $hook 插件列表名 */ function doAction($hook){ global $emHooks; $args = array_slice(func_get_args(), 1);//获取其他参数 if (isset($emHooks[$hook])){ foreach ($emHooks[$hook] as $function){ $string = call_user_func_array($function, $args); } } } ~~~ 第二步:设置钩子埋入点 ~~~ define("APP_ROOT",str_replace("\\","/",dirname(__FILE__))."/"); require("function.php"); //加载功能函数 /** * 加载插件路径 * 一般情况下,我们要先存储和判断插件是否激活, *你可以保存在数据库中,也可以保存在文件配置缓存中 */ function load_plugins_file($plugin) { //要判断和检查。 if(is_string($plugin) && preg_match("/^[\w\-\/]+$/", $plugin) && file_exists(APP_ROOT."plugins/".$plugin.".php")){ require APP_ROOT."plugins/".$plugin.".php"; } } //演示的插件例子 $pluginsName = array("check_all","login"); foreach($pluginsName as $plugin){ load_plugins_file($plugin); } //埋下的钩子 doAction("fbbin"); ~~~ 第三步:插件代码实现 ~~~ <?php function check_all() { echo "<p>全部通过</p>"; } addAction("fbbin","check_all");//像fbbin插件列表中添加插件,那么之后执行的doAction函数就能在全局变量中找到这个插件了,那么这样子,这个插件便会被执行。 ?> ~~~