初めに
Smarty や pukiwiki には、あとから機能を追加できるようなプラグインが用意されていますが、あれに近いことをやってみたいと思いました。
実装する機能
例えば、こんな感じで実行したいプラグインを並べた配列があったとします。
index.php
$command_list = array(
'plugin_1',
'plugin_2',
'plugin_3',
);
この配列に指定されたプラグインを外部の php ファイルから読み込んで実行したいと思います。
実際のコード
まず、実行するプラグインを作成します。今回は、実行すると、実行したプラグインが分かるような文字列が返るようにします。
plugin_1.php
<?php
class plugin_1 {
function toString() {
return 'execute_plugin_1';
}
}
plugin_2.php
<?php
class plugin_2 {
function toString() {
return 'execute_plugin_2';
}
}
plugin_3.php
<?php
class plugin_3 {
function toString() {
return 'execute_plugin_3';
}
}
各プラグインを、このように plugin_1.php ~ plugin_3.php まで作っておきます。次に、これを順次実行するようなサンプルを作ってみます。
index.php
<?php
$command_list = array(
'plugin_1',
'plugin_2',
'plugin_3',
);
$plugin = array();
$txt = '';
foreach($command_list as $v) {
if (isset($plugin[$v]) === false) {
require_once($v.'.php');
$plugin[$v] = $v;
}
$txt .= $plugin[$v]::toString();
}
echo $txt;
index.php を実行すると、
実行結果
execute_plugin_1execute_plugin_2execute_plugin_3
と出力されます。
最後に
サンプルでは、プラグインを3個用意していますが、将来的に exec_plugin_4 を追加したくなるかもしれません。その時は、plugin_4.php を作れば、機能が拡張されます。
実際に作成する場合は、$command_list は DB や外部ファイルから読み込んだり、リリース時のプログラムと分離できるようにする必要など考慮した方がいいでしょう。また、存在しないプラグインを実行できないようにしたり、ファイルの存在確認や、今回のケースだと、クラスに toString() 関数が実装されているか確認したり、色々やることがありそうです。