初心者はデザインパターンについてかなり混乱していると思います。今日は週末なので、システムの核となるシングルピースモードとコマンドチェーンモードを組み合わせた記事を書きました。記事は簡単すぎます、時間が限られているので(妻と買い物に行かなければなりません、笑)、デザインの不規則性、コードの書き方の不規則性、バグなどがあります。すべてを願っています。私のレベルには限界があります。
誰もが PHP でのデザイン パターンの適用に関する多くの本や記事を読んだと思いますが、そのほとんどが直接例を示しているとは感じていません。
読んでみると、コードが複雑になりすぎないように、例外処理などの内容は追加されていないため
、プロジェクトの実践がないとデザインパターンの部分を理解するのが難しいと感じます。
シングルトン モードとコマンド チェーン モードの基本的な知識については、詳しくは説明しませんので、自分で調べてください。
<?php
/*
*@作者:NoAngels
*@時刻: 2008 年 8 月 30 日
*/
インターフェースIRunAction{
// APPで実行できるクラスに定義されたメソッドを取得します
静的関数 LoadActions();
//クラス内のエントリ関数は、クラス内の他の関数を呼び出すために使用されます
関数 runAction($action, $args);
}
/*
※APPシステムの中核部分
*/
クラスAPP{
静的プライベート $__instance = null;
静的プライベート $__commands = array();
静的プライベート $__flag = 1;
プライベート関数 __construct(){}
// シングルピース モード デザインは、このクラスの唯一のインスタンスを取得します
静的関数 Load(){
if(self::$__instance == null) self::$__instance = 新しいアプリ;
self::$__instance を返します。
}
//APP の $__instance に名前を追加します。新しいコマンドを追加するたびに、このクラスのインスタンスが以前に追加されているかどうかを確認します。
// 存在する場合は操作を無視します。存在しない場合は追加します。
パブリック関数 addCommand($cmdName){
foreach(self::$__commands as $cmd){
if(strto lower(get_class($cmd)) == strto lower(get_class($cmdName))){
self::$__フラグ = 0;
壊す;
}
}
if(self::$__flag == 1) self::$__commands[] = $cmdName;
self::$__フラグ = 1;
}
// コマンド チェーン モード設計のコア部分は、インスタンスのエントリ関数を呼び出します
//まず、この操作の呼び出しがクラスで許可されているかどうかを確認します。許可されていない場合は、未定義の操作を要求して終了します。
public function runCommand($action, $args){
self::$__フラグ = 0;
foreach(self::$__commands as $cmd){
if(in_array($action, $cmd->LoadActions())){
self::$__フラグ = 1;
$cmd->runAction($action, $args);
}
}
if(self::$__flag == 0){
self::$__フラグ = 1;
exit("アクションごとに未定義のアクション: $action");
}
}
//クラスのインスタンスを削除するには、クラスの名前を指定するだけです。
パブリック関数removeCommand($className){
foreach(self::$__commands as $key=>$cmd){
if(strto lower(get_class($cmd)) == strto lower($className)){
unset(self::$__commands[$key]);
}
}
}
// 追加と削除が成功したかどうかを全員がテストするため
パブリック関数 viewCommands(){
echo(count(self::$__commands));
}
}
//クラス ユーザーはインターフェイス IRunAction を実装します
class ユーザーが IRunAction{ を実装する
// 呼び出せるオペレーションを定義する
static private $__actions = array('addUser', 'modifyUser', 'removeUser');
//実際のプロセスでは呼び出すことができる操作を取得します。$__actions は公開呼び出しとして設計されています。
// $__actions の値を取得するには、LoadActions 関数を設計する必要があります。
静的パブリック関数 LoadActions(){
self::$__actions を返します。
}
//指定された関数を実行する
パブリック関数 runAction($action, $args){
//この関数の使い方が分からない場合はマニュアルを参照してください。
call_user_func(array($this,$action), $args);
}
//単なるテスト関数
保護された関数 addUser($name){
エコー($name);
}
}
//テスト用のユーザー
クラス テストは IRunAction{ を実装します
static private $__actions = array('addTest', 'modifyTest', 'removeTest');
静的パブリック関数 LoadActions(){
self::$__actions を返します。
}
パブリック関数 runAction($action, $args){
call_user_func(array($this,$action), $args);
}
保護された関数 addTest($name){
エコー($name);
}
}
//以下はテストコードです
APP::Load()->addCommand(新しいユーザー);
APP::Load()->addCommand(新しいユーザー);
APP::Load()->addCommand(新しいユーザー);
APP::Load()->addCommand(新しいユーザー);
APP::Load()->runCommand('addUser', 'NoAngels');
APP::Load()->addCommand(新しいテスト);
APP::Load()->runCommand('addTest', null);
APP クラスはシングルトン モードで設計されており、これがシステムのコア部分であることがコードを見るとわかると思います。 APP クラスのインスタンスをロードします。これは、一部の書籍の getInstance 静的メソッドに相当します。addCommand、runCommand、removeCommand という 3 つのパブリック メソッドがあり、これはコマンド チェーン モードの中核となる起動プログラムでもあります。特定の実装についてはソース コードを参照してください。コードはここでは詳しく説明しません。
します
。これは、APP の runCommand 関数によって呼び出すことができる操作を含む配列です。
システムの実行プロセスは次のとおりです。
-------addCommand、実行する操作が属するクラスを APP に追加します。追加したクラスがシングルトン モードを使用して設計されている場合は、次のように addCommand(SingletonClass::Load()) を追加できます。それ以外の場合は、次のように追加できます。
addCommand(new someClass)
を呼び出します。
-------runCommand。たとえば、User クラスに addUser という操作があり、APP 内の $__commands 配列を直接ループできます。いずれかのクラスのインスタンスです。この操作がある場合は、インスタンスの runAction 関数を呼び出します。addCommand を使用して特定のクラスのインスタンスを追加しない場合は、未定義の操作を求めるプロンプトが表示され、終了します。
User クラスと Test クラスの runAction は、このクラスの対応する関数である call_user_func を呼び出します。
これで説明と使用方法が終わりました。すべてを自分で行う必要があることは、あなた自身の理解です (追記: フレームワーク内の単一のエントリ ファイルにすることができます。MVC を実装するかどうかはあなたの考え次第です)。