php怎么把文件设定为插件
php如何把文件设定为插件?PHP中插件机制的一种实现方案
插件,亦即Plug-in,是指一类特定的功效模块(平常由第三方开发者实现),它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无 论是激活还是禁用都不影响系统中心模块的运转,也就是说插件是一种非侵入式的模块化设计,实现了中心程序与插件程序的松懈耦合。一个典型的例子就是 Wordpress中众多的第三方插件,比方Akimet插件用于对会员的评论停止Spam过滤。
一个强健的插件机制,我认为必需具备以下特点:
● 插件的动态监听和加载(Lookup)
● 插件的动态触发
以上两点的实现均不影响中心程序的运转
要在程序中实现插件,我们第一应当想到的就是定义不一样的钩子(Hooks);“钩子”是一个很形象的逻辑概念,你可以认为它是系统预留的插件触发前提。它 的逻辑道理如下:当系统施行到某个钩子时,会推断这个钩子的前提可否知足;假如知足,会转而先去调取钩子所拟定的功效,然后返回连续施行余下的程序;假如 不知足,跳过即可。这有点像汇编中的“中止庇护”逻辑。
某些钩子大概是系统事先就设计好的,比方此前我举的关于评论Spam过滤的钩子,平常它已经由中心系统开发人员设计进了评论的处置逻辑中;别的一类钩子则 大概是由会员自行定制的(由第三方开发人员拟定),平常存在于展现层,比方一个一般的PHP表单显示页面中。
大概你感受上面的话比力无聊,让人昏昏欲睡;但是要看懂下面我写的代码,懂得以上的道理是必不成少的。
下面停止PHP中插件机制的中心实现,整个机制中心分为三大块:
一个插件经理类:这是中心之中心。它是一个利用程序全局Global对象。它主要有三个职责:
● 负责监听已经注册了的所有插件,并实例化这些插件对象。
● 负责注册所有插件。
● 当钩子前提知足时,触发对应的对象办法。
插件的功效实现:这大多由第三方开发人员完成,但需要遵照必然的规则,这个规则是插件机制所规定的,因插件机制的不一样而不一样,下面的显 示代码你会看到这个规则。
插件的触发:也就是钩子的触发前提。详细来说这是一小段代码,放置在你需要插件实现的地方,用于触发这个钩子。
道理讲了一大堆,下面看看我的实现方案:
插件经理PluginManager类:
<? /** * STBLOG PluginManager Class * * 插件机制的实现中心类 * * @package STBLOG * @subpackage Libraries * @category Libraries * @author Saturn */ class PluginManager { /** * 监听已注册的插件 * * @access private * @var array */ private $_listeners = array(); /** * 结构函数 * * @access public * @return void */ public function __construct() { #这里$plugin数组包括我们猎取已经由会员激活的插件信息 #为演示利便,我们假定$plugin中至少包括 #$plugin = array( # 'name' => '插件名称', # 'directory'=>'插件安置名目' #); $plugins = get_active_plugins();#这个函数请自行实现 if($plugins) { foreach($plugins as $plugin) {//假定每个插件文件夹中包括一个actions.php文件,它是插件的详细实现 if (@file_exists(STPATH .'plugins/'.$plugin['directory'].'/actions.php')) { include_once(STPATH .'plugins/'.$plugin['directory'].'/actions.php'); $class = $plugin['name'].'_actions'; if (class_exists($class)) { //初始化所有插件 new $class($this); } } } } #此处做些日志记载方面的东西 } /** * 注册需要监听的插件办法(钩子) * * @param string $hook * @param object $reference * @param string $method */ function register($hook, &$reference, $method) { //猎取插件要实现的办法 $key = get_class($reference).'->'.$method; //将插件的援用连同办法push进监听数组中 $this->_listeners[$hook][$key] = array(&$reference, $method); #此处做些日志记载方面的东西 } /** * 触发一个钩子 * * @param string $hook 钩子的名称 * @param mixed $data 钩子的入参 * @return mixed */ function trigger($hook, $data='') { $result = ''; //查看要实现的钩子,可否在监听数组之中 if (isset($this->_listeners[$hook]) && is_array($this->_listeners[$hook]) && count($this->_listeners[$hook]) > 0) { // 轮回调取开端 foreach ($this->_listeners[$hook] as $listener) { // 取出插件对象的援用和办法 $class =& $listener[0]; $method = $listener[1]; if(method_exists($class,$method)) { // 动态调取插件的办法 $result .= $class->$method($data); } } } #此处做些日志记载方面的东西 return $result; } } ?>
以上代码加上注释不超越100行,就完成了整个插件机制的中心。需要再次说明的是,你必需将它设定成全局类,在所有 需要用到插件的地方,优先加载。用#注释的地方是你需要自行完成的部分,包罗插件的猎取和日志记载等等。
下面是一个简便插件的实现。
<? /** * 这是一个Hello World简便插件的实现 * * @package DEMO * @subpackage DEMO * @category Plugins * @author Saturn */ /** *需要留意的几个默许规则: * 1. 本插件类的文件名必需是action * 2. 插件类的名称必需是{插件名_actions} */ class DEMO_actions { //解析函数的参数是pluginManager的援用 function __construct(&$pluginManager) { //注册这个插件 //第一个参数是钩子的名称 //第二个参数是pluginManager的援用 //第三个是插件所施行的办法 $pluginManager->register('demo', $this, 'say_hello'); } function say_hello() { echo 'Hello World'; } } ?>
这是一个简便的Hello World插件,用于输出一句话。在实际状况中,say_hello大概包罗对数据库的操纵,或者是其他一些特定的逻辑,比方调取Akimet API。
插件实现的默许规则由中心系统开发者自行肯定。比方本例的一些默许规则我在注释中已经写的很分明,在此不在赘述。需要特殊留意的是钩子名称不要反复。
最后一步,就是定义钩子的触发,你将钩子放在哪里,上面这个插件的办法就会在哪里动身。比方我要将say_hello放到我博客首页Index.php, 那么你在index.php中的某个位置写下:
$pluginManager->trigger('demo','');
第一个参数表示钩子的名字,在本例中它是demo;第二个参数是插件对应办法的入口参数,由于这个例子中没有输入参数,所认为空。
总结
本篇文章介绍了插件机制在PHP中实现的一种办法和思绪,乃至我本人对插件机制的懂得。初次接触这个东西,大概会比力生涩,难以懂得。但是当你结合真实的 例子,再想想程序的运转流程,思绪大概会更清楚一些。结果图:
以上就是php如何把文件设定为插件的具体内容,更多请关注百分百源码网其它相关文章!