Heim  >  Artikel  >  Backend-Entwicklung  >  So legen Sie eine Datei als Plugin in PHP fest

So legen Sie eine Datei als Plugin in PHP fest

藏色散人
藏色散人Original
2020-02-03 09:23:502853Durchsuche

So legen Sie eine Datei als Plugin in PHP fest

Wie lege ich eine Datei als Plug-in in PHP fest? Eine Implementierungslösung für den Plug-in-Mechanismus in PHP

Plug-in, auch Plug-in genannt, bezieht sich auf einen bestimmten Typ von Funktionsmodul (normalerweise von Drittentwicklern implementiert). Eigenschaften sind: Aktivieren Sie es, wenn Sie es benötigen, und deaktivieren/löschen Sie es, wenn Sie es nicht benötigen. Unabhängig davon, ob es aktiviert oder deaktiviert ist, hat es keinen Einfluss auf den Betrieb des Kernmoduls des Systems -in ist ein nicht-intrusives modulares Design, das eine lose Kopplung von Kernprogrammen und Plug-Ins ermöglicht. Ein typisches Beispiel sind die zahlreichen Plug-ins von Drittanbietern in WordPress, wie zum Beispiel das Akimet-Plug-in, das zum Filtern von Spam auf Benutzerkommentare verwendet wird.

Ein robuster Plug-in-Mechanismus muss meiner Meinung nach die folgenden Eigenschaften haben:

● Dynamische Überwachung und Laden von Plug-ins (Lookup)

● Dynamische Auslösung von Plug-Ins

Die Implementierung der beiden oben genannten Punkte hat keinen Einfluss auf den Betrieb des Kernprogramms

Das Implementieren von Plug-Ins im Programm ist das erste, was wir tun Denken Sie daran, verschiedene Hooks zu definieren. „Hooks“ ist ein sehr anschauliches logisches Konzept. Sie können es sich als eine vom System reservierte Plug-in-Triggerbedingung vorstellen. Das logische Prinzip lautet wie folgt: Wenn das System einen bestimmten Hook ausführt, bestimmt es, ob die Bedingungen des Hooks erfüllt sind. Wenn diese erfüllt sind, ruft es zuerst die durch den Hook angegebene Funktion auf und kehrt dann zurück, um mit der Ausführung fortzufahren Der Rest des Programms ruft zuerst die durch den Hook angegebene Funktion auf und überspringt sie einfach. Dies ähnelt ein wenig der „Interrupt-Schutz“-Logik in der Assembly.

Einige Hooks wurden möglicherweise im Voraus vom System entworfen, wie zum Beispiel der Hook, den ich zuvor über die Kommentar-Spam-Filterung erwähnt habe. Normalerweise wurden sie von den Kernsystementwicklern in die Kommentarverarbeitungslogik integriert können von Benutzern angepasst werden (von Drittentwicklern entwickelt) und sind normalerweise in der Präsentationsschicht vorhanden, beispielsweise auf einer gewöhnlichen PHP-Formularanzeigeseite.

Vielleicht finden Sie die oben genannten Wörter langweilig und schläfrig, aber um den Code zu verstehen, den ich unten geschrieben habe, ist es wichtig, die oben genannten Prinzipien zu verstehen.

Das Folgende ist die Kernimplementierung des Plug-in-Mechanismus in PHP. Der Kern des gesamten Mechanismus ist in drei Hauptblöcke unterteilt:

Eine Plug-in-Manager-Klasse: Dies ist die Kern des Kerns. Es handelt sich um ein anwendungsglobales globales Objekt. Es hat drei Hauptaufgaben:

● Verantwortlich für die Überwachung aller registrierten Plug-Ins und die Instanziierung dieser Plug-In-Objekte.

● Verantwortlich für die Registrierung aller Plug-Ins.

● Wenn die Hook-Bedingung erfüllt ist, wird die entsprechende Objektmethode ausgelöst.

Plug-in-Funktionsimplementierung: Dies wird meist von Drittentwicklern durchgeführt, es müssen jedoch bestimmte Regeln befolgt werden. Diese Regel wird vom Plug-in-Mechanismus vorgegeben und variiert je nach Plug-in-Mechanismus. Sie sehen den folgenden Anzeigecode. Siehe diese Regel.

Auslösung des Plug-Ins: Das heißt, die Auslösebedingung des Hooks. Konkret handelt es sich hierbei um einen kleinen Codeabschnitt, der dort platziert wird, wo Sie die Plug-in-Implementierung benötigen, um diesen Hook auszulösen.

Ich habe über viele Prinzipien gesprochen, werfen wir einen Blick auf meinen Implementierungsplan:

Plugin Manager PluginManager-Klasse:

<?
/**
* 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;
    }
}
?>

Der obige Code plus Kommentare sollte 100 Zeilen nicht überschreiten, was den Kern des gesamten Plug-In-Mechanismus vervollständigt. Was noch einmal erklärt werden muss, ist, dass Sie es als globale Klasse festlegen und es zuerst überall dort laden müssen, wo das Plug-In benötigt wird. Die mit # kommentierten Stellen sind die Teile, die Sie selbst vervollständigen müssen, einschließlich Plug-in-Erfassung und -Protokollierung usw.

Das Folgende ist die Implementierung eines einfachen Plug-Ins. ​​

<?
/**
* 这是一个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;;
    }
}
?>

Dies ist ein einfaches Hello World-Plug-in, das zur Ausgabe eines Satzes verwendet wird. In tatsächlichen Situationen kann say_hello Vorgänge in der Datenbank oder eine andere spezifische Logik umfassen, beispielsweise den Aufruf der Akimet-API.

Die Standardregeln für die Plug-in-Implementierung werden von den Kernsystementwicklern selbst festgelegt. Einige der Standardregeln in diesem Beispiel habe ich beispielsweise in den Kommentaren deutlich geschrieben, daher werde ich hier nicht auf Details eingehen. Besonderes Augenmerk sollte darauf gelegt werden, dass sich Hook-Namen nicht wiederholen.

Der letzte Schritt besteht darin, die Auslösung des Hooks zu definieren. Wo Sie den Hook platzieren, beginnt die Methode des obigen Plug-Ins. Wenn ich beispielsweise say_hello auf der Startseite meines Blogs, Index.php, platzieren möchte, dann schreibst du irgendwo in index.php:

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

Der erste Parameter stellt den Namen des Hooks dar, in diesem Fall ihn ist demo; Der zweite Parameter ist der Eingabeparameter der entsprechenden Methode des Plug-Ins. Da in diesem Beispiel keine Eingabeparameter vorhanden sind, ist er leer.

Zusammenfassung

In diesem Artikel werden eine Methode und Idee zur Implementierung des Plug-in-Mechanismus in PHP sowie mein eigenes Verständnis des Plug-in-Mechanismus vorgestellt. Wenn Sie zum ersten Mal mit diesem Ding in Kontakt kommen, ist es möglicherweise etwas ungewohnt und schwer zu verstehen. Aber wenn Sie es mit realen Beispielen kombinieren und über den laufenden Prozess des Programms nachdenken, wird die Idee möglicherweise klarer. Rendering:

Das obige ist der detaillierte Inhalt vonSo legen Sie eine Datei als Plugin in PHP fest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn