>백엔드 개발 >PHP 튜토리얼 >PHP에서 파일을 플러그인으로 설정하는 방법

PHP에서 파일을 플러그인으로 설정하는 방법

藏色散人
藏色散人원래의
2020-02-03 09:23:502909검색

PHP에서 파일을 플러그인으로 설정하는 방법

PHP에서 파일을 플러그인으로 설정하는 방법은 무엇입니까? 플러그인이라고도 알려진 PHP

플러그인의 플러그인 메커니즘 구현 솔루션은 특정 유형의 기능 모듈을 의미합니다(일반적으로 타사 개발자가 구현함). 필요하지 않은 경우 비활성화/삭제합니다. 활성화 여부에 관계없이 플러그인은 시스템의 핵심 모듈 작동에 영향을 미치지 않습니다. 핵심 프로그램과 플러그인 프로그램의 느슨하게 결합된 통합을 실현합니다. 일반적인 예로는 사용자 댓글에서 스팸을 필터링하는 데 사용되는 Akimet 플러그인과 같은 WordPress의 수많은 타사 플러그인이 있습니다.

강력한 플러그인 메커니즘은 다음과 같은 특성을 가져야 한다고 생각합니다.

● 플러그인의 동적 모니터링 및 로딩(Lookup)

● 플러그인의 동적 트리거

위 두 가지 사항의 구현 핵심 프로그램의 작동에 영향을 미치지 않습니다

프로그램에서 플러그인을 구현하려면 먼저 다른 후크를 정의해야 합니다. "후크"는 매우 생생한 논리적 개념이며 다음과 같이 생각할 수 있습니다. 이는 시스템에 의해 예약된 플러그인 트리거 조건입니다. 그 논리 원리는 다음과 같습니다. 시스템이 특정 후크를 실행할 때 후크의 조건이 충족되는지 여부를 확인하고, 충족되면 먼저 후크에서 지정한 함수를 호출한 다음 반환하여 계속 실행합니다. 프로그램의 나머지 부분이 충족되지 않으면 먼저 후크에 의해 지정된 함수를 호출하고 건너뜁니다. 이는 어셈블리의 "인터럽트 보호" 논리와 약간 비슷합니다.

일부 후크는 시스템에 의해 미리 설계되었을 수 있습니다. 예를 들어 앞서 댓글 스팸 필터링에 대해 언급한 후크는 일반적으로 핵심 시스템 개발자가 다른 유형의 후크를 사용자가 사용자 정의하도록 설계했습니다. (타사 개발자가 공식화)은 일반적으로 일반 PHP 양식 표시 페이지와 같은 프리젠테이션 계층에 존재합니다.

위의 말이 지루하고 졸리다고 느끼실 수도 있겠지만, 아래에 작성한 코드를 이해하려면 위의 원칙을 이해하는 것이 필수적입니다.

다음은 PHP에서 플러그인 메커니즘의 핵심 구현입니다. 전체 메커니즘의 핵심은 세 가지 주요 블록으로 나뉩니다.

플러그인 관리자 클래스: 이것이 핵심의 핵심입니다. 응용 프로그램 전역 전역 개체입니다. 여기에는 세 가지 주요 책임이 있습니다.

● 등록된 모든 플러그인을 모니터링하고 이러한 플러그인 개체를 인스턴스화하는 역할을 담당합니다.

● 모든 플러그인 등록을 담당합니다.

● 후크 조건이 충족되면 해당 개체 메서드가 트리거됩니다.

플러그인 기능 구현: 이는 대부분 타사 개발자가 수행하지만 특정 규칙을 따라야 합니다. 이 규칙은 플러그인 메커니즘에 따라 규정되며 플러그인 메커니즘에 따라 다릅니다. 아래 표시 코드의 규칙.

플러그인 트리거링: 즉 후크의 트리거링 조건입니다. 특히 이것은 이 후크를 트리거하기 위해 플러그인 구현이 필요한 곳에 배치되는 작은 코드 조각입니다.

많은 원칙에 대해 이야기했는데 구현 계획을 살펴보겠습니다.

Plugin Manager 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(
        #    &#39;name&#39; => &#39;插件名称&#39;,
        #    &#39;directory&#39;=>&#39;插件安装目录&#39;
        #);
        $plugins = get_active_plugins();#这个函数请自行实现
        if($plugins)
        {
            foreach($plugins as $plugin)
            {//假定每个插件文件夹中包含一个actions.php文件,它是插件的具体实现
                if (@file_exists(STPATH .&#39;plugins/&#39;.$plugin[&#39;directory&#39;].&#39;/actions.php&#39;))
                {
                    include_once(STPATH .&#39;plugins/&#39;.$plugin[&#39;directory&#39;].&#39;/actions.php&#39;);
                    $class = $plugin[&#39;name&#39;].&#39;_actions&#39;;
                    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).&#39;->&#39;.$method;
        //将插件的引用连同方法push进监听数组中
        $this->_listeners[$hook][$key] = array(&$reference, $method);
        #此处做些日志记录方面的东西
    }
    /**
     * 触发一个钩子
     *
     * @param string $hook 钩子的名称
     * @param mixed $data 钩子的入参
     *    @return mixed
     */
    function trigger($hook, $data=&#39;&#39;)
    {
        $result = &#39;&#39;;
        //查看要实现的钩子,是否在监听数组之中
        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(&#39;demo&#39;, $this, &#39;say_hello&#39;);
    }
     
    function say_hello()
    {
        echo &#39;Hello World&#39;;
    }
}
?>

문장을 출력하는 데 사용되는 간단한 Hello World 플러그인입니다. 실제 상황에서 say_hello에는 데이터베이스에 대한 작업이나 Akimet API 호출과 같은 기타 특정 논리가 포함될 수 있습니다.

플러그인 구현에 대한 기본 규칙은 핵심 시스템 개발자가 직접 결정합니다. 예를 들어, 이 예의 기본 규칙 중 일부를 주석에 명확하게 작성했으므로 여기서는 자세히 설명하지 않겠습니다. 후크 이름을 반복하지 않도록 특별한 주의를 기울여야 합니다.

마지막 단계는 후크의 트리거링을 정의하는 것입니다. 후크를 배치하는 위치에서 위 플러그인의 메서드가 시작됩니다. 예를 들어 내 블로그 Index.php의 홈 페이지에 say_hello를 추가하려면 index.php 어딘가에 다음과 같이 작성합니다.

$pluginManager->trigger(&#39;demo&#39;,&#39;&#39;);

첫 번째 매개변수는 후크의 이름을 나타내며, 이 경우에는 데모입니다. 두 번째 첫 번째 매개변수는 플러그인의 해당 메소드의 입력 매개변수입니다. 이 예에서는 입력 매개변수가 없으므로 비어 있습니다.

요약

이 글에서는 PHP에서 플러그인 메커니즘을 구현하는 방법과 아이디어, 그리고 플러그인 메커니즘에 대한 나만의 이해를 소개합니다. 처음 이 일을 접하시면 조금 낯설고 이해하기 어려울 수도 있습니다. 하지만 실제 예제와 결합하여 프로그램의 실행 과정을 생각해보면 아이디어가 더 명확해질 수 있습니다. 렌더링:

위 내용은 PHP에서 파일을 플러그인으로 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.