PHP の B/S プログラミング モードを使用して、C/S ソフトウェア プログラミング モードでプラグイン エンジン機能を実現します。
<?php /** * 摘取天上星 版 插件引擎 第二版 version 2.0 * By: 摘取天上星! * Emali: happy.yin@qq.com * Date: 2012升级版 **/ $plugin_arr=array(); $plugin_meta=array(); $plugin_remove=array(); $action_arr=array(); $action_meta=array(); $action_remove=array(); $idx=0; /* * 执行插件引擎中捆绑的所有函数事件(函数执行顺序参加addPlugin函数添加插件时的第四个参数数字,数字越大优先级越高) * $tag 要执行的函数集插件标签名 * $args 要往函数中传入的参数,依次按顺序填写,键名同addPlugin添加插件时第三个参数传入的键名、数量对应一致,键名对应的值即传入的参数值, * 该插件引擎是有返回值的插件引擎 */ function doPlugin($tag,$args=array()){ global $plugin_arr,$plugin_remove; $first=array_search(current($args),$args); if(empty($plugin_arr[$tag])) return $args[$first]; if(isset($plugin_remove[$tag])){ foreach($plugin_remove[$tag] as $func){ removePlugin($tag,$func); } } krsort($plugin_arr[$tag]); foreach($plugin_arr[$tag] as $plugins){ foreach($plugins as $plugins){ $plugins['args']=array_merge($plugins['args'],$args); $args[$first]=call_user_func_array($plugins['func'],array_slice($plugins['args'],0,$plugins['args_count'])); } } return $args[$first]; } /* 第一个参数为自定义标签集名, * 第二个参数是你要向标签集里添加的函数名, * 第三个数组参数为第二个参数strAndStr1函数对应的参数集,有多少个函数参数,就需要添加多少个数组元素, 参数按照先后顺序依次填写,键值为空即可,且插件里所有函数的参数个数必须一致,一个以上的参数,可多个, 这里的传参数组只需要预写好键名即可,在调用doPlugin插件时给对应的键值传入键名对应的实际参数值即可 * 第四个参数为排序参数,从1到10的纯数字,数值越大执行优先级越高,反之越小,默认为值为最大优先级10 * addPlugin('cleanText','strAndStr1',array('str'=>'','str2'=>''),1); * addPlugin('cleanText','strAndStr2',array('str'=>'','str2'=>''),2); */ function addPlugin($tag,$func,$args=array(),$sort=10){ global $plugin_arr,$plugin_meta,$idx; $plugin_arr[$tag][$sort][++$idx]=array('func'=>$func,'args'=>$args,'args_count'=>sizeof($args)); $plugin_meta[$tag][$func][$idx]=$sort; } /* * 立即删除函数集标签中 的某个函数 * 第一个参数为自定义函数集标签名称 * 第二个参数为要从函数集里 删除的单个函数名称 */ function removePlugin($tag,$func){ global $plugin_arr,$plugin_meta; if(isset($plugin_meta[$tag][$func])){ foreach($plugin_meta[$tag][$func] as $idx=>$sort){ unset($plugin_arr[$tag][$sort][$idx]); } unset($plugin_meta[$tag][$func]); } } /* * 在下次执行doPlugin时删除函数集标签中 的某个函数(在doPlugin中的插件函数执行前删除,并且删除后执行插件引擎!) * 第一个参数为自定义函数集标签名称 * 第二个参数为要从函数集里 删除的单个函数名称 */ function addRemovePlugin($tag,$func){ global $plugin_remove; if(in_array($func,(array)$plugin_remove[$tag])) return ; $plugin_remove[$tag][]=$func; } /* * 如下执行插件方法同上述有返回值的执行插件使用方法对应一致, * 唯一的区别是没有返回值 */ /* * 执行插件引擎 */ function doAction($tag,$args=array()){ global $action_arr,$action_remove; if(empty($action_arr[$tag])) return ; if(isset($action_remove[$tag])){ foreach($action_remove[$tag] as $func){ removeAction($tag,$func); } } krsort($action_arr[$tag]); foreach($action_arr[$tag] as $action_sort){ foreach($action_sort as $action_idx){ $action_idx['args']=array_merge($action_idx['args'],$args); call_user_func_array($action_idx['func'],array_slice($action_idx['args'],0,$action_idx['args_count'])); } } } /* * 向插件引擎里添加函数 */ function addAction($tag,$func,$args=array(),$sort=10){ global $action_arr,$action_meta,$idx; $action_arr[$tag][$sort][++$idx]=array('func'=>$func,'args'=>$args,'args_count'=>sizeof($args)); $action_meta[$tag][$func][$idx]=$sort; } /* * 从插件引擎里删除 执行的函数 */ function removeAction($tag,$func){ global $action_arr,$action_meta; if(isset($action_meta[$tag][$func])){ foreach($action_meta[$tag][$func] as $idx=>$sort){ unset($action_arr[$tag][$sort][$idx]); } unset($action_meta[$tag][$func]); } } /* * 添加预删除函数,该函数会在下次执行插件引擎时,在函数集调用前被删除 */ function addRemoveAction($tag,$func){ global $action_remove; if(in_array($func,(array)$action_remove[$tag])) return ; $action_remove[$tag][]=$func; } /* 摘取天上星 - 期待更深层次的扩展压缩...*/?>
//実行例は以下の通り
//プラグインエンジンで使用するテスト関数を用意するfunction str2str2($str){
return '
P タグ開始 '.$str.' P タグ終了
'function str3str3($str){
return 'b tag start'.$ str.' b tag end';
}
//注: 3 つの例をテストするときは、必ず 1 つずつテストしてください。そうしないと機能しません 異常な結果を生み出すプラグイン エンジンの権限優先順位の実際の比較をご覧ください。
例 1:
//str2str2 関数の実行優先度は str3str3 よりも小さいです。ここでは、str3str3($str) 関数が最初に実行され、次に str2str2($str) 関数が実行されます。//実際に実行されるプロセスは次のとおりです。次のように:
$str=str3str3( 'これはプラグイン内のすべての関数に渡されるパラメーターに似ています。ここでの関数 str3str3 の実行優先順位は str2str2 よりも高くなります');
echo $str;
/*ブラウザで出力結果を表示 HTML ソースコードは次の内容を取得します:
P タグの開始b タグの開始 このようになります。プラグイン内のすべての関数に渡されるパラメーター。ここでの関数 str3str3 の実行優先度は高くなります。 str2str2 で終了 P タグで終了
'cleanText','str2str2',array('str'=>''),1);addPlugin('cleanText','str3str3',array('str'=>''),10); echo doPlugin('cleanText',array('str'=>'これはプラグイン内のすべての関数と同様です。渡された関数 str3str3 の実行優先順位は str2str2 よりも高くなります'));
//例 2:
addPlugin('cleanText','str2str2',array('str'=>''),10);
addPlugin('cleanText','str3str3',array('str'=>''),1) ;
echo doPlugin('cleanText',array('str'=>'これはプラグインのすべてと同様です。関数によって渡されるパラメータです。ここでの関数 str2str2 の実行優先順位は str3str3 よりも高くなります' ));
/*操作結果のHTMLページのソースコードは以下の通りです
bタグstart
パラメータと同様です。プラグイン内のすべての関数に渡される関数 str2str2 の実行優先度は str3str3 よりも高くなります。
*/
//例 3:
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>'') ) ,1);
echo doPlugin('cleanText',array('str'=>'パーミッションソート値が同じサイズの場合、後続の関数のパーミッション優先度は前の関数よりも小さくなります、最初に追加された関数が最初に実行されます。ここでは関数 str3str3 実行優先度は str2str2'));
/* 実行後の HTML ソース コードの結果は次のとおりです:
Pタグ開始 パーミッションソート値サイズ 一致した場合、後続の機能パーミッションの優先度が前のものよりも低いため、最初に追加した機能が先に実行されます。 function str3str3 は str2str2 よりも下位です。 P タグの終了
// doAction 実行プラグインのテスト例 (このプラグインには戻り値、実行のみ! )
/*注、このプラグインは戻り値プラグインであるため、出力または直接実行にのみ使用されます。優先順位は doPlugin プラグインの優先順位設定と同じなので、ここでは説明しません。詳細!
関数alertstr($str){
echo "<script>alert('$str');</script>"
}関数alertstr2($str){
echo $str.'1+2' ;
addAction('alert','alertstr',array('str'=>''),1);
addAction('alert','alertstr2',array('str'=>'') ),10);
doAction('alert',array('str'=>'ポップアップするパラメータ'));
//実行後の HTML ソースコードの結果は次のとおりです:
//パラメータ1 ポップアップする +2<script>alert('ポップアップするパラメータ');</script>
?>

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。
