#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( # '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'; } } ?>
$pluginManager->trigger('demo','');
概要
この記事では、PHP でプラグインの仕組みを実装する方法と考え方、およびプラグインについての私自身の理解を紹介します。仕組み的には。初めてこれに触れるときは、少し馴染みがなく、理解するのが難しいかもしれません。しかし、実際の例と組み合わせてプログラムの実行プロセスを考えると、アイデアがより明確になるかもしれません。レンダリング:
以上がPHPでファイルをプラグインとして設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。