ホームページ  >  記事  >  バックエンド開発  >  PHPでファイルをプラグインとして設定する方法

PHPでファイルをプラグインとして設定する方法

藏色散人
藏色散人オリジナル
2020-02-03 09:23:502807ブラウズ

PHPでファイルをプラグインとして設定する方法

#PHP でファイルをプラグインとして設定するにはどうすればよいですか? PHP

プラグイン プラグイン メカニズムの実装ソリューション (プラグインとも呼ばれる) は、特定のタイプの機能モジュール (通常はサードパーティ開発者によって実装される) を指します。特徴は、必要なときに有効にし、不要になったときに無効化/削除できること、および有効化または無効化にかかわらず、システムのコア モジュールの動作に影響を与えないことです。 -in は、コア プログラムとプラグインの疎結合を実現する非侵入型のモジュラー設計です。典型的な例は、ユーザー コメントのスパムをフィルタリングするために使用される Akimet プラグインなど、WordPress の多数のサードパーティ プラグインです。

堅牢なプラグイン メカニズムには、次の特性が必要だと思います。

# プラグインの動的なモニタリングと読み込み (ルックアップ)

## ● プラグインの動的なトリガープラグイン

上記 2 点の実装は、コア プログラムの動作には影響しません。

プログラムにプラグインを実装するには、まず、考えるべきことは、異なるフック (フック) を定義することです。「フック」 これは非常に鮮やかな論理概念であり、システムによって予約されているプラ​​グインのトリガー条件と考えることができます。その論理原理は次のとおりです: システムが特定のフックを実行すると、フックの条件が満たされているかどうかが判断され、条件が満たされている場合は、最初にフックで指定された関数が呼び出され、次に戻ってフックの実行が継続されます。プログラムの残りの部分。条件が満たされない場合は、フックで指定された関数が最初に呼び出されます。スキップするだけです。これは、アセンブリの「割り込み保護」ロジックに似ています。

一部のフックは、システムによって事前に設計されている場合があります。たとえば、コメント スパム フィルタリングについて前述したフックは、通常、コア システム開発者によってコメント処理ロジックに設計されています。別のカテゴリのフックが含まれる場合があります。ユーザーによってカスタマイズされ (サードパーティ開発者によって開発されました)、通常は通常の PHP フォーム表示ページなどのプレゼンテーション層に存在します。

上の言葉は退屈で眠気を感じるかもしれませんが、私が以下に書いたコードを理解するには、上記の原則を理解することが不可欠です。

次は、PHP におけるプラグイン メカニズムのコア実装です。メカニズム全体は 3 つの主要なブロックに分かれています:

A プラグイン マネージャー クラス: これは、芯。これはアプリケーションのグローバルな Global オブジェクトです。これには 3 つの主な役割があります。

## ● 登録されているすべてのプラグインを監視し、これらのプラグイン オブジェクトをインスタンス化する責任があります。

#● すべてのプラグインの登録を担当します。

# フック条件が満たされると、対応するオブジェクト メソッドがトリガーされます。

プラグイン機能の実装: これは主にサードパーティの開発者によって行われますが、特定のルールに従う必要があります。このルールはプラグインのメカニズムによって規定されており、プラグインのメカニズムによって異なります。次の表示コードが表示されます。このルールを参照してください。

プラグインのトリガー: つまり、フックのトリガー条件。具体的には、これは、このフックをトリガーするプラグイン実装が必要な場所に配置される小さなコードです。

多くの原則について説明しました。実装計画を見てみましょう:

プラグイン マネージャー 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 の呼び出しなどの他の特定のロジックが含まれる場合があります。

プラグイン実装のデフォルトのルールは、コア システム開発者自身によって決定されます。たとえば、この例のデフォルト ルールの一部はコメントに明確に記載しているので、ここでは詳細には触れません。フック名を繰り返さないように特別な注意を払う必要があります。

最後のステップはフックのトリガーを定義することです。フックを配置した場所で、上記のプラグインのメソッドが開始されます。たとえば、say_hello を自分のブログのホームページ Index.php に配置したい場合は、index.php のどこかに次のように記述します。

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

最初のパラメータはフックの名前を表します。この場合、最初のパラメータはフックの名前を表します。これはデモです; 2 番目のパラメータは、プラグインの対応するメソッドのエントリ パラメータです。この例では入力パラメータがないため、空です。

概要

この記事では、PHP でプラグインの仕組みを実装する方法と考え方、およびプラグインについての私自身の理解を紹介します。仕組み的には。初めてこれに触れるときは、少し馴染みがなく、理解するのが難しいかもしれません。しかし、実際の例と組み合わせてプログラムの実行プロセスを考えると、アイデアがより明確になるかもしれません。レンダリング:

以上がPHPでファイルをプラグインとして設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。