百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> php怎么把文件设定为插件
分享文章到:

php怎么把文件设定为插件

发布时间:09/01 来源:未知 浏览: 关键词:

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如何把文件设定为插件的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板