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怎样把文件设置为插件的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!