私は、私は人々が、プラグインのインターフェイスを拡張するために使用することができます何かを作成したいこの時間は、新しいWebアプリケーションを作成するためにPHPを使用して開始しました。
プラグは、特定のイベントに取り付けることができるように、コード内の「フック」を書くためにどのように?
あなたは、Observerパターンを使用することができます。この機能を達成するための簡単な方法:
<?php
/** Plugin system **/
$listeners = array();
/* Create an entry point for plugins */
function hook() {
global $listeners;
$num_args = func_num_args();
$args = func_get_args();
if($num_args < 2)
trigger_error("Insufficient arguments", E_USER_ERROR);
// Hook name should always be first argument
$hook_name = array_shift($args);
if(!isset($listeners[$hook_name]))
return; // No plugins have registered this hook
foreach($listeners[$hook_name] as $func) {
$args = $func($args);
}
return $args;
}
/* Attach a function to a hook */
function add_listener($hook, $function_name) {
global $listeners;
$listeners[$hook][] = $function_name;
}
/////////////////////////
/** Sample Plugin **/
add_listener('a_b', 'my_plugin_func1');
add_listener('str', 'my_plugin_func2');
function my_plugin_func1($args) {
return array(4, 5);
}
function my_plugin_func2($args) {
return str_replace('sample', 'CRAZY', $args[0]);
}
/////////////////////////
/** Sample Application **/
$a = 1;
$b = 2;
list($a, $b) = hook('a_b', $a, $b);
$str = "This is my sample applicationn";
$str .= "$a + $b = ".($a+$b)."n";
$str .= "$a * $b = ".($a*$b)."n";
$str = hook('str', $str);
echo $str;
?>
<STRONG>出力:
This is my CRAZY application
4 + 5 = 9
4 * 5 = 20
**注:
この例のソースコードのために、あなたが拡張したい実際のソースコードの前にすべてのプラグインを宣言する必要があります。私はプラグインするための単一または複数の値の転送を処理する方法の例が含まれています。これは、各フックに渡されたパラメータを示し、実際の文書を書くの最も難しい部分です。
これは、PHPでのプラグインシステムを完了するためのひとつの方法です。より良いオプションがありますが、私はあなたがより多くの情報のためのWordPressのマニュアルを参照してください示唆しています。
申し訳ありませんが、アンダースコア文字をHTMLエンティティに値下げを交換していますか?このエラーが解決されると、私はこのコードを再発行することができます。
編集:あなたが_編集する場合にのみ、問題ではありません。
それは聞いてタスクを処理するために、あなたのクラスのメソッドを変更する必要がありますし、いくつかの一般的なものを必要とするため、あなたはObserverパターンを必要としないというこの仮定がある場合。あなたが使用したくないと仮定しextends
、あなたのクラスの他のクラスを継承している可能性があるため、継承を。どのような種類が難なくそれことができようにする一般的な方法はありますか?これはどのようにあります:
<?php
////////////////////
// PART 1
////////////////////
class Plugin {
private $_RefObject;
private $_Class = '';
public function __construct(&$RefObject) {
$this->_Class = get_class(&$RefObject);
$this->_RefObject = $RefObject;
}
public function __set($sProperty,$mixed) {
$sPlugin = $this->_Class . '_' . $sProperty . '_setEvent';
if (is_callable($sPlugin)) {
$mixed = call_user_func_array($sPlugin, $mixed);
}
$this->_RefObject->$sProperty = $mixed;
}
public function __get($sProperty) {
$asItems = (array) $this->_RefObject;
$mixed = $asItems[$sProperty];
$sPlugin = $this->_Class . '_' . $sProperty . '_getEvent';
if (is_callable($sPlugin)) {
$mixed = call_user_func_array($sPlugin, $mixed);
}
大专栏 允许插入PHP应用程序的最佳方法 return $mixed;
}
public function __call($sMethod,$mixed) {
$sPlugin = $this->_Class . '_' . $sMethod . '_beforeEvent';
if (is_callable($sPlugin)) {
$mixed = call_user_func_array($sPlugin, $mixed);
}
if ($mixed != 'BLOCK_EVENT') {
call_user_func_array(array(&$this->_RefObject, $sMethod), $mixed);
$sPlugin = $this->_Class . '_' . $sMethod . '_afterEvent';
if (is_callable($sPlugin)) {
call_user_func_array($sPlugin, $mixed);
}
}
}
} //end class Plugin
class Pluggable extends Plugin {
} //end class Pluggable
////////////////////
// PART 2
////////////////////
class Dog {
public $Name = '';
public function bark(&$sHow) {
echo "$sHow<br />n";
}
public function sayName() {
echo "<br />nMy Name is: " . $this->Name . "<br />n";
}
} //end class Dog
$Dog = new Dog();
////////////////////
// PART 3
////////////////////
$PDog = new Pluggable($Dog);
function Dog_bark_beforeEvent(&$mixed) {
$mixed = 'Woof'; // Override saying 'meow' with 'Woof'
//$mixed = 'BLOCK_EVENT'; // if you want to block the event
return $mixed;
}
function Dog_bark_afterEvent(&$mixed) {
echo $mixed; // show the override
}
function Dog_Name_setEvent(&$mixed) {
$mixed = 'Coco'; // override 'Fido' with 'Coco'
return $mixed;
}
function Dog_Name_getEvent(&$mixed) {
$mixed = 'Different'; // override 'Coco' with 'Different'
return $mixed;
}
////////////////////
// PART 4
////////////////////
$PDog->Name = 'Fido';
$PDog->Bark('meow');
$PDog->SayName();
echo 'My New Name is: ' . $PDog->Name;
パート1では、あなたは、PHPスクリプトの先頭使用する可能性がありますrequire_once()
それらを含む呼び出しを。これは、プラグイン可能なクラスを作成するには、クラスをロードします。
私たちはクラスをロードしたところである第2部では、。私はオブザーバーパターンが大きく異なっているもちろん、のための特別な何もする必要はありませんので、予めご了承ください。
第3部では、我々はクラスに切り替える「プラガブル」(すなわち、私たちはメソッドとプロパティをカバーするウィジェットクラスをサポートしましょう)。したがって、たとえば、あなたがWebアプリケーションを持っている場合、あなたはプラグインのレジストリを持っているかもしれませんが、あなたはここでプラグインを有効にすることができます。また、そのノートDog_bark_beforeEvent()
機能を。私はreturnステートメントの前に設定した場合$ mixed ='BLOCK_EVENT'
、それは何の事件は存在しませんので、吠えはDog_bark_afterEventを停止します停止します。
パート4では、通常のオペレーションコードですが、コードを実行すると、実行されないだろうと考えるかもしれないことに注意してくださいています。たとえば、その名前を発表しなかった犬は「ファイド」が、「ココ」です。犬は「ニャー」が、「ウーフ」を言うことはありません。あなたは犬の名前を確認したいときには、あなたはそれがむしろ「ココア」よりも「異なる」であることがわかります。これらの書き換えはすべて、パート3で提供されています。
だから、どのようにこの仕事をしますか?それでは、除外しましょうeval()
(誰もが「悪」と言う)、そしてそれはObserverパターンを排除するものではありません。したがって、プラグイン可能な空洞がクラスを知られ、それは属性とメソッドDogクラスが含まれていません動作します。だから、それが発生するため、私たちのために魔法を行います。パート3とパート4で、我々はプラグイン可能なクラスオブジェクトではなく、犬クラス自体から派生混乱の理由です。私たちは犬を「タッチ」オブジェクトを行うにため代わりに、我々はプラグインクラスをしましょう。
(これはデザインパターンのいくつかの種類がある場合、私は知らない-私に教えてください。)
著者の同意なしに、これは禁止し、違反者責任があります!