php怎么把文件设置为插件-php教程

资源魔 11 0

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开发自学

抱歉,评论功能暂时关闭!